我的WPF MVVM应用程序中有以下场景。 ListView绑定到ViewModel上的集合(Orders
)。对于集合中的每个对象,将显示有关该项目的一行数据。
还有一个单元本身绑定到另一个ViewModel集合(SelectedDates
),该集合为SelectedDates集合中的每个项创建一个复选框。
当用户单击该复选框时,需要激活一个命令。该命令的参数必须是相应Order和SelectedDate对象的ID。
现在,我知道我可以使用MultiBinding和转换器来实现这一目标。我感兴趣的是,在研究这个时,似乎普遍认为将一个或两个参数作为ViewModel属性并避免将它们作为参数完全传递会更好。
但是,在这个特定的场景中(或者,实际上,在处理绑定到ViewModel集合的ListView中生成的命令的许多场景中),我无法看到如何实现这一点。
所以问题是 - 是否可以使用ViewModel属性完全或部分地执行此操作,或者在此实例中MultiBinding是完成工作的唯一方法?
答案 0 :(得分:1)
关于MVVM的事情通常是,我们在视图模型中有数据,因此我们不需要访问UI控件。因此,如果数据将Order
属性绑定到ListView.SelectedItem
属性,那么该属性将反映所选项...这就是如何从数据绑定中获取Order.Id
值Order
对象:
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,因为它实际上只是对其他东西属性的反映。