【发布时间】:2017-04-03 01:34:20
【问题描述】:
这是我认为有问题的ListView 的相关部分:
<ListView ItemsSource="{Binding People}" >
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.HeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding AllSelected}" Command="{Binding ToggleSelectAll}" CommandParameter="{Binding}" />
</DataTemplate>
</GridViewColumn.HeaderTemplate>
</GridViewColumn.HeaderTemplate>
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
因此,第一列是绑定到行项目的IsSelected 属性的复选框,PickListPerson。
该命令在PersonPickListViewModel中声明如下:
public DelegateCommand<PersonPickListViewModel> ToggleSelectAll { get; set; } = new DelegateCommand<PersonPickListViewModel>(vm =>
{
vm.AllSelected = !vm.AllSelected;
vm.People.ToList().ForEach(p => p.IsSelected = vm.AllSelected);
},
vm => true
);
我将视图模型作为命令参数传递,以便在命令的动作委托的静态上下文中访问视图模型的实例属性。
但是,当我单击标题列复选框时,不会调用此命令。为什么会这样?
【问题讨论】:
-
IsSelected 和 AllSelected 中缺少 OnPropertyChanged?可能太明显而无法检查。
-
我在
AllSelected', butIsSelected` 上有属于ObservableCollection<PickListPerson>的每个成员,我希望该集合能够处理它所绑定的更改通知。 -
ObservableCollection 会自动引发事件,但仅用于添加/删除元素。仍然要更改集合中对象内的属性,您需要 OnPropertyChanged 通知。
标签: c# wpf xaml mvvm delegatecommand