[英]MultiBinding vs ViewModel properties for Commands inside bound WPF MVVM ListView
我的WPF MVVM應用程序中具有以下情形。 有一個ListView綁定到ViewModel上的集合( Orders
)。 對於集合中的每個對象,將顯示有關該項目的一行數據。
還有一個單元格本身綁定到另一個ViewModel集合( SelectedDates
),該集合為SelectedDates集合中的每個項目創建一個復選框。
用戶單擊復選框時,需要激活命令。 該命令的參數必須是相應的Order和SelectedDate對象的ID。
現在,我知道可以使用MultiBinding和轉換器來實現此目的。 讓我感興趣的是,在研究此內容時,似乎普遍同意,最好將一個或兩個參數作為ViewModel屬性,並最好避免將它們作為參數一起傳遞。
但是,我茫然地看到在這種特定情況下(或者,實際上,在許多情況下,您正在處理綁定到ViewModel集合的ListView內生成的命令),如何才能做到這一點。
因此,問題是-是否可以全部或部分使用ViewModel屬性來執行此操作,或者在這種情況下,MultiBinding是完成工作的唯一方法嗎?
關於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
}
}
如果我對您的理解正確,那么您想對集合中的某個項目執行命令,這將導致另一個集合被更新。
實現此目的的一種方法是為您的Order
創建一個ViewModel類(與用作視圖DataContext的ViewModel相比,有人需要為這種ViewModel提出一個更好,更少混淆的術語。 )(具有IsSelected
屬性),您需要將其用作ListView
項中CheckBox
的綁定目標。 然后,您的主VM維護OrderVm
的集合,而不是直接維護Order
。 然后,您可以將SelectedDates
集合的getter定義為:
OrderVm.Where(x=>x.IsSelected)
...而放棄了setter,因為它實際上只是其他屬性的反映。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.