为什么不调用此命令?

时间:2016-11-19 06:38:59

标签: c# wpf xaml mvvm delegatecommand

以下是我认为问题的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的实例属性。

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

1 个答案:

答案 0 :(得分:2)

绑定DataContext时的CommandParamter是People集合中的项目。我猜这不是你所期待的PersonPickListViewModel。无论此类型是否都无法转换为PersonPickListViewModel,该命令都不会被调用。

首次评论后修改:如果您的PersonPickListViewModel位于窗口的根目录,则可以使用“DataContext Anchoring”来实现。只需在Window(即x:Name="view")中添加一个名称,然后更新您的绑定即可使用ElementName来源,如下所示:

{Binding ElementName=view, Path=DataContext}