2013-12-12 118 views
0

我有一個名爲Layer2Info綁定列表框的ObservableCollection在WPF

public class Layer2Info 
{ 
    public ObservableCollection<totalAvailablePorts> availableClientPorts = new ObservableCollection<totalAvailablePorts>(); 
} 

類totalAvailablePorts類是

public class totalAvailablePorts : INotifyPropertyChanged 
{ 
    public int _portID; 
    public Boolean _isSelected; 

    public int portID 
    { 
     get { return _portID; } 
     set { _portID = value; NotifyPropertyChanged("portID"); } 
    } 
    public Boolean isSelected 
    { 
     get { return _isSelected; } 
     set { _isSelected = value; NotifyPropertyChanged("isSelected"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    public override string ToString() 
    { 
     return string.Format("{0}", portID); 
    } 
} 

在availableClientPorts數據的創建是:

  for (int i = 1; i <= 3; i++) 
     { 
      totalAvailablePorts newPort = new totalAvailablePorts(); 
      newPort.portID = i; 
      newPort.isSelected = false; 
      layer2InfoConfig.availableClientPorts.Add(newPort);    
     } 

現在,在我的主窗口中,我將ListBox綁定到Layer2Info.availableClientPorts,如下所示:

clientPortsList.ItemsSource = layer2InfoConfig.availableClientPorts; 

和最後一個就是我的XAML:

            <ListBox x:Name="clientPortsList" SelectionMode="Extended" DisplayMemberPath="{Binding Path=portID}" SelectedValuePath="{Binding Path=isSelected}" Height="50"> 
               </ListBox> 

現在,我可以看到所有的端口(1-3)在列表框,但我想要做的是,在每一個我在ListBox中選擇的行,我想要在availableClientPorts中的isSelected值更改爲true,我不知道從哪裏開始。 有什麼建議嗎?

回答

0

首先,SelectedValuePath是不是你想象的。 MSDN says它「獲取或設置用於從SelectedItem獲取SelectedValue的路徑」。因此,當用戶選擇一個項目時,clientPortsList將擁有自己SelectedItem的該屬性,並從clientPortsList.SelectedValue返回該屬性的值。通過多選,對您而言這不是一個真正有用的概念,無論如何,這與您在此問到的問題無關。

你想要做的是,爲每個totalAvailablePorts實例,該實例的isSelected屬性綁定到擁有它的ListBoxItemIsSelected財產。你可以用項目模板做到這一點,但是Style更簡單(如果你不想重新創建或改變默認的視覺行爲,那麼更好)。這答案是already on StackOverflow

<ListBox ItemsSource="..." 
    x:Name="clientPortsList" 
    SelectionMode="Extended" 
    DisplayMemberPath="{Binding Path=portID}" > 
    <ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
    <!-- binding totalAvailablePorts.isSelected to ListBoxItem.IsSelected --> 
    <Setter Property="IsSelected" Value="{Binding isSelected}"/> 
    </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

對於ListBoxItem情況下,他們的DataContext將各自totalAvailablePorts實例,所以isSelected(小寫I)將「範圍」。

+0

優秀的解決方案,像魅力一樣工作! – amirm

相關問題