绑定WPF MVVM ListView中的命令的MultiBinding与ViewModel属性

时间:2014-08-12 10:47:17

标签: c# wpf mvvm

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

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

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

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

但是,在这个特定的场景中(或者,实际上,在处理绑定到ViewModel集合的ListView中生成的命令的许多场景中),我无法看到如何实现这一点。

所以问题是 - 是否可以使用ViewModel属性完全或部分地执行此操作,或者在此实例中MultiBinding是完成工作的唯一方法?

2 个答案:

答案 0 :(得分:1)

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

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
    }
}

答案 1 :(得分:0)

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

实现这一目标的一种方法是为您的Order创建一个viewmodel类(有人需要为这种视图模型提供一个更好,更少混淆的术语,而不是那种充当该类型的ViewModel视图的DataContext ...)具有IsSelected属性,您需要充当CheckBox项中ListView的绑定目标。然后,您的主虚拟机会直接维护OrderVm而非Order的集合。然后,您可以为SelectedDates集合定义getter,如:

OrderVm.Where(x=>x.IsSelected)

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