C# 将列表框绑定到WPF中的ObservableCollection
我有一个名为Layer2Info的类C# 将列表框绑定到WPF中的ObservableCollection,c#,wpf,binding,listbox,observablecollection,C#,Wpf,Binding,Listbox,Observablecollection,我有一个名为Layer2Info的类 public class Layer2Info { public ObservableCollection<totalAvailablePorts> availableClientPorts = new ObservableCollection<totalAvailablePorts>(); } 在availableClientPorts中创建数据的步骤是: for (int i = 1; i
public class Layer2Info
{
public ObservableCollection<totalAvailablePorts> availableClientPorts = new ObservableCollection<totalAvailablePorts>();
}
在availableClientPorts中创建数据的步骤是:
for (int i = 1; i <= 3; i++)
{
totalAvailablePorts newPort = new totalAvailablePorts();
newPort.portID = i;
newPort.isSelected = false;
layer2InfoConfig.availableClientPorts.Add(newPort);
}
最后是我的xaml:
<ListBox x:Name="clientPortsList"
SelectionMode="Extended"
DisplayMemberPath="{Binding Path=portID}"
SelectedValuePath="{Binding Path=isSelected}"
Height="50"/>
现在,我可以看到列表框中的所有端口1-3,但我想做的是,在列表框中选择的每一行上,我希望availableClientPorts中的isSelected值更改为true,我不知道从何处开始。
有什么建议吗?首先,这不是你想的。它获取或设置用于从SelectedItem获取SelectedValue的路径。因此,当用户选择一个项目时,clientPortsList将获取它自己的SelectedItem的属性,并从clientPortsList.SelectedValue返回该属性的值。对于multi-select,这对您来说不是一个真正有用的概念,而且无论如何,它与您在这里提出的问题无关
您要做的是,对于每个TotalAvailableReports实例,将该实例的isSelected属性绑定到拥有它的ListBoxItem的isSelected属性。您可以使用项目模板来实现这一点,但如果您对重新创建或更改默认的ListBoxItem视觉行为不感兴趣,则样式更简单、更好。答案是:
对于ListBoxItem实例,它们的DataContext将是各自的TotalAvailableReports实例,因此isSelected小写I将在范围内
clientPortsList.ItemsSource = layer2InfoConfig.availableClientPorts;
<ListBox x:Name="clientPortsList"
SelectionMode="Extended"
DisplayMemberPath="{Binding Path=portID}"
SelectedValuePath="{Binding Path=isSelected}"
Height="50"/>
<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>