以下是我认为问题的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
);
我将viewmodel作为命令参数传递,以便在命令的操作委托的静态上下文中访问viewmodel的实例属性。
然而,当我单击标题列复选框时,不会调用此命令。为什么会这样?
答案 0 :(得分:2)
绑定DataContext
时的CommandParamter
是People集合中的项目。我猜这不是你所期待的PersonPickListViewModel
。无论此类型是否都无法转换为PersonPickListViewModel
,该命令都不会被调用。
首次评论后修改:如果您的PersonPickListViewModel
位于窗口的根目录,则可以使用“DataContext Anchoring”来实现。只需在Window
(即x:Name="view"
)中添加一个名称,然后更新您的绑定即可使用ElementName
来源,如下所示:
{Binding ElementName=view, Path=DataContext}