2011-03-28 58 views
3

在使用MVVM過去,我已經創建了每個視圖作爲DataTemplate它是相應的viewmodel來處理連接它們。我剛開始使用MVVM Light,並注意到他們有ViewModelLocator。我看過的其他幾個工具包包含了一些變化,但是這會帶來怎樣的好處?DataTemplate將視圖模型連接到視圖的首選方法是什麼?

這是連接您的視圖和ViewModels的最佳做法?

+0

我剛剛回答了這個問題[here](http://stackoverflow.com/questions/5462040/what-is-a-viewmodellocator-and-what-are-its-pros-cons-compared-to-datatemplates) :) – Jon 2011-03-28 16:57:01

回答

6

有兩種不同的方法,而不是一個 「正確的方式」。

ViewModelLocator或類似的幫助是開發MVVM的「視圖優先」方法。通過這個,它意味着你在設計器中開始你的View,然後構建ViewModel來匹配。邏輯上,視圖通常會創建其他視圖,並且ViewModel通常通過某種形式的定位器加載並填充給定的視圖。消息或服務用於將適當的模型掛接到新生成的ViewModels。

這樣做的好處是可以更容易地進行視覺設計,特別是在使用Blend時。

另一種方法是使用「ViewModel-First」。由此,您生成您的ViewModels,然後使用DataTemplates來填充視圖。 ViewModels將編寫/創建其他虛擬機,直接設置適當的模型。從程序員的角度來看,這通常是(IMO)多得多,因爲事情直接起作用。然而,從設計師的角度來看,設計和工作通常更加困難,因爲設計時數據更難生成等等。

這兩種方法都是完全有效的,並且具有強大的優點和缺點。不同的MVVM純粹主義者傾向於更喜歡一種方法,出於各種各樣的原因 - 通常他們是從代碼清潔度角度還是從設計者的角度來看待這個問題。

+0

+1:很好的總結。 – Jon 2011-03-28 16:58:41

+0

+1直接回答。我相信ViewModelLocator是最好的選擇(稱我爲純粹主義者A和純粹主義者B)。有了它,你可以在你的XAML中發送你的datacontext,它允許你綁定你的控件的屬性 - 當你在你的ViewModel中設置你的datacontext時,這比猜測更容易。 – SQLMason 2011-03-31 20:00:30

1

我看到它的方式:

  1. 你必須對所有的ViewModels一個不錯的地方。
  2. MVVMLight提供了一個很好的清理機制。
  3. 你可以在你的標記中靜態連接你的ViewModels。 ---如果您沒有意識到您的ViewModel已經實例化並且在您創建UI實例後立即設置爲DataContext,則這可能有時會成爲問題。

對於(3)(如何使用ViewModelLocator):

  1. 確保你已經安裝了片段。
  2. 打開ViewModelLocator.cs和類型mvvmlocatorproperty。在intellisense中選擇它,然後雙擊Tab以使片段工作。將其更改爲適當的屬性。
  3. 在XAML中,你會使用這樣的:

    <Window.DataContext> 
        <Binding Path="HomePage" Source="{StaticResource Locator}"/> 
    </Window.DataContext> 
    

對於此屬性:

public HomePageViewModel HomePage 
    { 
     get 
     { 
      return HomePageStatic; 
     } 
    } 
相關問題