为什么不调用此命令?
Why is this command not invoked?
以下是我认为 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
);
我将视图模型作为命令参数传递,以便在命令的操作委托的静态上下文中访问视图模型的实例属性。
然而,当我单击 header 列复选框时,不会调用此命令。为什么会这样?
您绑定 CommandParamter
处的 DataContext
是人物集合中的项目。我猜这不是您所期待的 PersonPickListViewModel
。由于无法将此类型转换为 PersonPickListViewModel
,因此不会调用该命令。
在第一条评论后编辑: 如果您的 PersonPickListViewModel
位于 window 的根目录,您可以使用 "DataContext Anchoring" 到达它。只需将名称添加到您的 Window
(即 x:Name="view"
),然后更新您的绑定以使用 ElementName
来源,如下所示:
{Binding ElementName=view, Path=DataContext}
以下是我认为 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
);
我将视图模型作为命令参数传递,以便在命令的操作委托的静态上下文中访问视图模型的实例属性。
然而,当我单击 header 列复选框时,不会调用此命令。为什么会这样?
您绑定 CommandParamter
处的 DataContext
是人物集合中的项目。我猜这不是您所期待的 PersonPickListViewModel
。由于无法将此类型转换为 PersonPickListViewModel
,因此不会调用该命令。
在第一条评论后编辑: 如果您的 PersonPickListViewModel
位于 window 的根目录,您可以使用 "DataContext Anchoring" 到达它。只需将名称添加到您的 Window
(即 x:Name="view"
),然后更新您的绑定以使用 ElementName
来源,如下所示:
{Binding ElementName=view, Path=DataContext}