我有一个 ListBox c ObservableCollection<Model> Models
。ListBox 有一个 CheckBox 有一个绑定IsVisualizationModel
看法:
<Window.Resources>
<local:Model x:Key="models"/>
</Window.Resources>
<ListBox ItemsSource = "{Binding Models}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<CheckBox IsChecked="{Binding Source={StaticResource models}, Path=IsVisualizationModel}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
模型:
public class Model : INotifypropertyChanged
{
private bool isVisualizationModel;
public bool IsVisualizationModel
{
get { return isVisualizationModel; }
set
{
isVisualizationModel = value;
OnPropertyChanged();
}
}
// interface implementation
}
问题是我有一个完整的模型列表,然后在代码中我遍历它,检查 IsVisualizationModel 属性。检查时,我总是得到假,尽管绑定触发并将属性设置为真。显然,绑定更改了非当前列表项(ObservableCollection 模型)的属性。可能值得使用 ICommand 以某种方式传递特定的列表实例并更改它的 IsVisualizationModel 属性。我不知道如何正确实施。此外,我这里没有涉及 ViewModel,这对我来说似乎也是错误的。
你做得过火了。
这就是它应该如何工作
错误
这是xaml:
这个 C# 的逻辑等价物是:
也就是说,您创建该类的一个实例
Model
并将其放入资源字典中。做什么的?将其完全删除。另外,正如@EvgeniyZ 在评论中正确指出的那样:
Source={StaticResource models}
指示每个复选框应绑定到共享属性中的内容,该属性驻留在存储在窗口资源字典ListBox
中的类的单个实例中。Model
在这种情况下,它应该可以工作,以便当您更改任何复选框时,它们都会同时更改。换句话说,没有必要写任何新东西,而只是简单地删除发明。
为什么有效:
但是因为它将列表的每个元素都
ItemsSource="{Binding Models}"
设置为指向绑定集合的元素。DataContext
ListBox
也就是说,
DataContext
这里{Binding Models}
和这里{Binding IsVisualizationModel}
是两个不同的上下文。第一个是类的实例,第二个是类型MainViewModel
集合中的当前元素。Models
ObservableCollection<Model>
顺便说一句,为什么要调用课程
Model
?根据它的功能,我称之为ListBoxItemViewModel
.