簡體   English   中英

WPF MVVM ListView內的命令的MultiBinding vs ViewModel屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM