在使用MVVM過去,我已經創建了每個視圖作爲DataTemplate
它是相應的viewmodel來處理連接它們。我剛開始使用MVVM Light,並注意到他們有ViewModelLocator
。我看過的其他幾個工具包包含了一些變化,但是這會帶來怎樣的好處?DataTemplate
?將視圖模型連接到視圖的首選方法是什麼?
這是連接您的視圖和ViewModels的最佳做法?
在使用MVVM過去,我已經創建了每個視圖作爲DataTemplate
它是相應的viewmodel來處理連接它們。我剛開始使用MVVM Light,並注意到他們有ViewModelLocator
。我看過的其他幾個工具包包含了一些變化,但是這會帶來怎樣的好處?DataTemplate
?將視圖模型連接到視圖的首選方法是什麼?
這是連接您的視圖和ViewModels的最佳做法?
有兩種不同的方法,而不是一個 「正確的方式」。
ViewModelLocator
或類似的幫助是開發MVVM的「視圖優先」方法。通過這個,它意味着你在設計器中開始你的View,然後構建ViewModel來匹配。邏輯上,視圖通常會創建其他視圖,並且ViewModel通常通過某種形式的定位器加載並填充給定的視圖。消息或服務用於將適當的模型掛接到新生成的ViewModels。
這樣做的好處是可以更容易地進行視覺設計,特別是在使用Blend時。
另一種方法是使用「ViewModel-First」。由此,您生成您的ViewModels,然後使用DataTemplates來填充視圖。 ViewModels將編寫/創建其他虛擬機,直接設置適當的模型。從程序員的角度來看,這通常是(IMO)多得多,因爲事情直接起作用。然而,從設計師的角度來看,設計和工作通常更加困難,因爲設計時數據更難生成等等。
這兩種方法都是完全有效的,並且具有強大的優點和缺點。不同的MVVM純粹主義者傾向於更喜歡一種方法,出於各種各樣的原因 - 通常他們是從代碼清潔度角度還是從設計者的角度來看待這個問題。
我看到它的方式:
DataContext
,則這可能有時會成爲問題。對於(3)(如何使用ViewModelLocator):
ViewModelLocator.cs
和類型mvvmlocatorproperty
。在intellisense中選擇它,然後雙擊Tab以使片段工作。將其更改爲適當的屬性。在XAML中,你會使用這樣的:
<Window.DataContext>
<Binding Path="HomePage" Source="{StaticResource Locator}"/>
</Window.DataContext>
對於此屬性:
public HomePageViewModel HomePage
{
get
{
return HomePageStatic;
}
}
我剛剛回答了這個問題[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