2009-12-05 110 views
5

我正在嘗試學習MVVM模式。我遇到的主要問題是學習我應該在哪裏聲明,創建和綁定命令對象。MVVM命令綁定

2的例子:

  1. 我有作用就像一個開關板或主菜單的主窗體。顯示選單按鈕1和查看1,顯示選擇按鈕2和查看2。大。現在我想回到主窗體,所以我需要一個名爲「主菜單」的視圖1(和視圖2)上的按鈕。我應該在哪裏定義命令和命令處理程序,以便可以綁定到「ShowMainMenu」命令?我可以在View2ViewModel中創建它們,但是我無法顯示主視圖?或者,我可以在MainView模型中創建thim,但是如何在子視圖模型中將它們綁定到它們(我按照mvvm建議使用RelayCommand obejct,並且它們不會冒泡到父級)。

  2. 我在一個主窗口視圖中可見兩個用戶控件,我們稱它們爲MainView,UC1和UC2。其中每個都有ViewModel MainViewModel,UC1ViewModel,UC2View Model。我在UC1上有一個名爲「AddItem」的按鈕。它應該在UC2的列表中添加一個項目。 設置「AddItemCommand」並綁定到它的方法是什麼?該命令應該在MainViewModel,Uc1ViewModel還是UC2ViewModel?我該如何綁定它。

感謝您的幫助。

回答

3

1)您可以從一個基本ViewModel繼承View1Model和View2Model並在其中定義ShowMainMenu。

或(這是我的方法)

創建ContentPresenter RootView它會顯示所有的觀點。使用屬性ViewContent創建RootVeiwModel。將ContetnPresenter的內容屬性綁定到RootViewModel的ViewContent屬性。您可以使用object作爲ViewContent類型,但我建議您定義MainVView1Model,View1Model和View2Model支持的接口。更改ViewContent必須引發ProprtyChangedEvent。 在RootViewModel中定義ShowMainViewCommand,它將ViewContent更改爲MainViewModel(它將顯示爲MainView)。

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type RootView}}, 
         Path=DataContext.ShowMainViwe} 

有一些代碼來解釋什麼,我想說:

RootView然後在視圖1和視圖2巴頓指揮的屬性,方法綁定到該命令,exmple。XAML

... 
<ContentPresenter Content={Binding ViewContent} /> 
... 

RootViewModel.ca

class RootViewModel : INotifyPropertyCahnged 
{ 
    ... 
    private object _ViewContent; 
    public object ViewContent 
    { 
     get {return _ViewContent;} 
     set 
     { 
      _ViewContent = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged ("ViewContent"); 
      } 

     } 
    } 

    private RelayCommand _ShowMainView; 
    public ICommand ShowMainView 
    { 
     get 
     { 
      if (_ShowMainView == null) 
      { 
       _ShowMainView = new RelayCommand(x => ViewContent = new MainViewModel()); 
      } 
      return _ShowMainView; 
     } 
    } 
    ... 
} 

2)MainViewModel添加參考UC1ViewModel和UC2ViewModel - 那影響其他控制的方式。 MainViwModel必須包含包含UC1ViewModel和UC2ViewModel的屬性。第二個用戶控件的項目必須包含在ObservableCollection中。

我只是告訴你它是如何工作的代碼:

class UC1ViewModel : INotifyPropertyChanged 
{ 
    ... 
    private MainViewModel _Parent; 
    public UC1ViewModel(MainViewModel parent) 
    { 
     _Panert = parent; 
    } 

    private RelayCommand _AddItemToUC2; 
    public ICommand AddItemToUC2 
    { 
     get 
     { 
      if (_AddItemToUC2 = null) 
      { 
       // UC2Content is UC2ViewModel 
       // Items is ObservableCollection 
       _AddItemToUC2 = new RelayCommand(x => _Parent.UC2Content.Items.Add(...)); 
      } 
      return AddItemToUC2; 
     } 
    } 
    ... 
} 
+0

在第〔實施例設置 ViewContent =新MainViewModel()); 這應該是一個Window/UserControl?或者你真的把目前的內容設置爲視圖模型? – thrag 2009-12-06 05:17:44

+0

它是查看模型。如果將ContentPresenter放置在視圖中並將Content屬性綁定到ViewModel,則它將顯示爲關聯的視圖。您是否使用如下所示的view-viewmodel關聯: bniwredyc 2009-12-06 14:55:11

2

MainModel可以爲每個UCxViewModel擁有一個屬性,或者更容易的是一個ViewModel列表。 「顯示」命令將創建相應的UVxViewModel,訂閱由UVxViewModel發佈的「OnClose」事件,並將其添加到列表中。 MainView有一個綁定到此列表的控件(例如Tab Control),DataTemplates定義了要用於每個UCxViewModel的視圖。 當UVxViewModel觸發其OnClose事件時,MainModel將其從列表中移除,導致相應視圖「關閉」。

對於「添加項目」部分,ViewModels應共享相同的項目列表(模型)。然後,UC2ViewModel可以添加一個項目,並且UC1View將得到更新(如果列表實現了INotifyCollectionChanged)。

我發現this explanation對理解MVVM非常有幫助。