0

这是我认为有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行项目属性a 的复选框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
);

我将视图模型作为命令参数传递,以便在命令的操作委托的静态上下文中访问视图模型的实例属性。

然而,当我单击标题列复选框时,不会调用此命令。为什么会这样?

4

1 回答 1

2

DataContext您绑定的点是CommandParamterPeople 集合中的项目。我猜这不是PersonPickListViewModel你所期望的。因为无论这种类型是什么都不能转换PersonPickListViewModel为命令,所以不会被调用。

在第一条评论后编辑:如果您PersonPickListViewModel位于窗口的根目录,您可以使用“DataContext Anchoring”来获取它。只需为您的Window(ie x:Name="view") 添加一个名称,然后更新您的绑定以使用ElementName源,如下所示:

{Binding ElementName=view, Path=DataContext}

于 2016-11-19T07:52:32.560 回答