2013-12-12 2 views
0

У меня есть класс с именем Layer2Infoсвязывание ListBox с 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);    
     } 

сейчас , в моем MainWindow я привязываю 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, но то, что я хочу сделать, это то, что на каждом которую я выбираю в ListBox, я хочу, чтобы значение isSelected в доступныхClientPorts изменилось на true, и я не знаю, с чего начать. Любые предложения?

ответ

0

Во-первых, SelectedValuePath не то, что вы думаете. MSDN says it "Получает или задает путь, который используется для получения SelectedValue из SelectedItem." Поэтому, когда пользователь выбирает элемент, clientPortsList возьмет это собственное имущество SelectedItem и вернет значение этого свойства с clientPortsList.SelectedValue. С мульти-select, это не очень полезная концепция для вас, и во всяком случае это не связано с вопросом, который вы задаете здесь.

Что вы хотите сделать это, для каждого totalAvailablePorts например, связать isSelected свойство этого экземпляра к IsSelected собственности ListBoxItem, что владеет. Вы можете сделать это с помощью шаблона элемента, но стиль намного проще (и лучше, если вы не заинтересованы в воссоздании или изменении визуального поведения по умолчанию ListBoxItem). Этот ответ 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

Смежные вопросы