【问题标题】:Why is this command not invoked?为什么不调用此命令?
【发布时间】: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', but IsSelected` 上有属于ObservableCollection&lt;PickListPerson&gt; 的每个成员,我希望该集合能够处理它所绑定的更改通知。
  • ObservableCollection 会自动引发事件,但仅用于添加/删除元素。仍然要更改集合中对象内的属性,您需要 OnPropertyChanged 通知。

标签: c# wpf xaml mvvm delegatecommand


【解决方案1】:

绑定CommandParamter 处的DataContext 是People 集合中的项目。我猜这不是您期待的PersonPickListViewModel。因为无论这种类型是什么都不能转换为PersonPickListViewModel,因此不会调用该命令。

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

{Binding ElementName=view, Path=DataContext}

【讨论】:

  • 是的,你是对的。 PersonPickListViewModel 是整个视图的数据上下文。我如何将其指定为标题模板的数据上下文?我使用&lt;Window.DataContext&gt;&lt;vm:PersonPickListViewModel /&gt;&lt;/Window.DataContext&gt;在视图中指定了它。
  • 我已经扩展了答案以展示如何实现这一点。
  • 非常感谢。 Gaarg,一个不使用名称的整个项目,现在我需要一个。我想只有一个就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2015-10-25
  • 2018-03-26
  • 2011-11-11
  • 1970-01-01
  • 2014-02-28
相关资源
最近更新 更多