【问题标题】:MultiBinding vs ViewModel properties for Commands inside bound WPF MVVM ListView绑定 WPF MVVM ListView 内的命令的 MultiBinding 与 ViewModel 属性
【发布时间】:2014-08-12 10:47:16
【问题描述】:

我的 WPF MVVM 应用程序中有以下场景。有一个 ListView 绑定到 ViewModel 上的集合 (Orders)。对于集合中的每个对象,都会显示有关该项目的一行数据。

还有一个单元格本身绑定到另一个 ViewModel 集合 (SelectedDates),它为 SelectedDates 集合中的每个项目创建一个复选框。

当用户点击复选框时,需要激活一个命令。该命令的参数必须是相应 Order 和 SelectedDate 对象的 ID。

现在,我知道我可以使用 MultiBinding 和转换器来实现这一点。让我感兴趣的是,在研究这一点时,似乎普遍认为将一个或两个参数作为 ViewModel 属性并避免将它们作为参数传递会更好。

但是,我不知道在这种特定场景中(或者,实际上,在许多场景中,您正在处理绑定到 ViewModel 集合的 ListView 中生成的命令)如何实现这一点。

所以问题是 - 是否可以完全或部分使用 ViewModel 属性,或者在这种情况下 MultiBinding 是完成工作的唯一方法?

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    关于 MVVM 的事情是,通常我们在视图模型中拥有数据,因此我们不需要访问 UI 控件。因此,如果您将Order 属性数据绑定到ListView.SelectedItem 属性,那么该属性将反映所选项目...这就是您可以从数据绑定Order 对象中获取Order.Id 值的方式:

    int id = SelectedOrder.Id;
    

    现在有了SelectedDates 集合,我假设您也可以直接从视图模型或通过选定的Order 对象间接访问它。据推测,您的Order 类具有某种DateTime 属性,该属性是绑定到集合中选定日期的数据。如果是这样,那么您可以将 INotifyPropertyChanged.PropertyChanged 处理程序附加到视图模型中的 Order 项,每次值更改时都会调用该项:

    Order类中:

    public DateTime SomeProperty
    {
        get { return someProperty; }
        set
        {
            someProperty = value;
            NotifyPropertyChanged("SomeProperty");
        }
    }
    

    在视图模型中:

    public Order SelectedOrder
    {
        get { return selectedOrder; }
        set
        {
            selectedOrder = value;
            NotifyPropertyChanged("SelectedOrder");
            selectedOrder.PropertyChanged += Item_PropertyChanged;
        }
    }
    

    ...

    private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "SomeProperty")
        {
            // Do something here with SelectedOrder and SelectedOrder.SomeProperty here
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果我对您的理解正确,那么您希望对集合中的项目触发命令,这将导致不同的集合被更新。

      实现这一点的一种方法是为您的Order 创建一个视图模型类(与充当数据上下文的视图模型相比,有人需要为这种视图模型想出一个更好、更容易混淆的术语)具有IsSelected 属性的视图...),您需要充当ListView 项目中CheckBox 的绑定目标。然后,您的主 VM 会直接维护 OrderVm 而不是 Order 的集合。然后,您可以将 SelectedDates 集合的 getter 定义为:

      OrderVm.Where(x=>x.IsSelected)

      ...放弃setter,因为它实际上只是其他东西的属性的反映。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 2020-05-17
        • 1970-01-01
        • 2018-09-20
        • 2021-08-29
        • 2011-09-28
        • 1970-01-01
        相关资源
        最近更新 更多