如何根据列表中是否存在绑定对象来设置 CheckBox.IsChecked
有 2 个列表——AvailableItems 和 SelectedItems。
AvailableItems 显示在一个 ListBox 中,每个 ListBoxItem 都包含一个 CheckBox。目的是如果绑定项位于 SelectedItems 中,则检查 CheckBox。
我可以在不处理代码隐藏中的 Checked 和 Unchecked 且不向项目类添加 IsSelected 属性的情况下实现此目的吗?
这是到目前为止的 XAML:
<ListBox Name="ListBox1" ItemsSource="{Binding Path=AvailableItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<DockPanel>
<CheckBox Name="cb1"></CheckBox>
<TextBlock Text="{Binding}"></TextBlock>
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
和隐藏代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
_availableItems.Add(Colors.Red);
_availableItems.Add(Colors.Green);
_availableItems.Add(Colors.Blue);
_selectedItems.Add(Colors.Green);
this.DataContext = this;
}
ObservableCollection<Color> _selectedItems = new ObservableCollection<Color>();
public ObservableCollection<Color> SelectedItems
{
get { return _selectedItems; }
set { _selectedItems = value; }
}
ObservableCollection<Color> _availableItems = new ObservableCollection<Color>();
public ObservableCollection<Color> AvailableItems
{
get { return _availableItems; }
set { _availableItems = value; }
}
}
可以将上面的 xaml/代码直接复制到新的 WPF 项目中进行测试。
There are 2 lists - AvailableItems and SelectedItems.
AvailableItems is displayed in a ListBox, and each ListBoxItem contains a CheckBox. The intention is that the CheckBox is checked if the bound item is in SelectedItems.
Can I achieve this without handling Checked and Unchecked in the code-behind, and without adding an IsSelected property to my item class?
Here's the XAML so far:
<ListBox Name="ListBox1" ItemsSource="{Binding Path=AvailableItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<DockPanel>
<CheckBox Name="cb1"></CheckBox>
<TextBlock Text="{Binding}"></TextBlock>
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
and the code-behind:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
_availableItems.Add(Colors.Red);
_availableItems.Add(Colors.Green);
_availableItems.Add(Colors.Blue);
_selectedItems.Add(Colors.Green);
this.DataContext = this;
}
ObservableCollection<Color> _selectedItems = new ObservableCollection<Color>();
public ObservableCollection<Color> SelectedItems
{
get { return _selectedItems; }
set { _selectedItems = value; }
}
ObservableCollection<Color> _availableItems = new ObservableCollection<Color>();
public ObservableCollection<Color> AvailableItems
{
get { return _availableItems; }
set { _availableItems = value; }
}
}
The above xaml/code can be copied straight into a new WPF project for testing.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您定义一个多值转换器,它接受一个项目和一个集合并返回一个布尔值:
然后像这样使用它:
处理反向转换留作练习。
You define a multi value converter that takes an item and a collection and returns a boolean:
and then you use it like this:
Handling the reverse conversion is left as an exercise.
使用 MVVM 进行粗略模型
创建一个类来表示每个项目所需的所有数据,例如 Checked 和描述
创建一个类来表示您想要显示的项目集合
添加到窗口
您维护一个项目列表,并提供一个属性获取执行简单 LINQ 选择的选定内容。简单的。根据需要更改数据类型。
A rough mock up using MVVM
create a class to represent all the data you need for each item eg Checked and description
create a class to represent the item collection you want displayed
Add to window
You maintain a single list of items, and supply a property to get the selected ones which does a simple LINQ select. Easy. Change datatypes as you need.