2010-06-02 47 views
1

我對WPF比較陌生,而且我很難確定我相當確定的是一個相對簡單的問題。操作集合和ViewModel模式

我有我的基礎數據對象,一個Person:

class Person 
{ 
    public string Surname {get; set; } 
    public string Firstname {get; set; } 
    public List<Address> Addresses {get; } 
} 

我想顯示在我的WPF應用程序編輯此對象。爲此我創建了我綁定到我的XAML一個ViewModel:

class PersonViewModel 
{ 
    public string Fullname {get; } 
    public ObservableCollection<AddressViewModel> Addresses {get; } 
} 

這是好的,當它涉及到操縱我的地址集,在那裏我可以不知道是什麼我應該做的,除了:

  • 我要補充方法AddAddressRemoveAddress等...我PersonViewModel類與AddressViewModel
  • 情況下,我應該只是AddressViewModel實例添加到我的Addresses observab操縱我的收藏le collection

上述兩者都顯得有點混亂 - 有沒有更好的方式來處理集合?

回答

2

我會建議在您的ViewModel中添加命令。例如,你將有一個AddAddressCommand和一個RemoveAddressCommand。您可以將這些命令綁定到視圖(例如,您可以將按鈕綁定到AddAddressCommand),該按鈕將執行ViewModel中將添加到該集合的方法。

 public ObservableCollection<AddressViewModel> Addresses { get; set; } 

    public RelayCommand AddAddressCommand 
    { 
     get 
     { 
      if (_addAddressCommand == null) 
      { 
       _addAddressCommand = new RelayCommand(p => this.AddAddress_Execute()); 
      } 
      return _addAddressCommand; 
     } 
    } 

    private void AddAddress_Execute() 
    { 
     Addresses.Add(new AddressViewModel()); 
    } 

(在我使用RelayCommand上面的例子,這是一個實現ICommand接口的自定義類,你可以閱讀更多關於這個RelayCommand here

另外一個側面說明:我不會創建AddressViewModel我只需要一個實現INotifyPropertyChanged的AddressModel,除非你的顯示邏輯不在你的模型中,否則不需要另一個地址viewmodel。

+0

你可以用一個??操作符替換你的if +賦值語句 – Henrik 2010-06-02 10:59:33

+0

aah很酷,謝謝 – 2010-06-02 11:44:45

+0

你也可能需要添加一個地址AddAddress_Execute中的Person.Addresses與新的AddressVM一起使用,或稍後對集合進行一些同步,就像保存操作一樣。 – 2010-06-03 03:24:04