簡體   English   中英

在哪里將ViewModel綁定到View?

[英]Where to bind the ViewModel to the View?

我正在Windows Phone 7.5及更高版本上的項目(共6頁)上工作。 我不使用純MVVM模型,因為處理導航事件和查詢字符串是如此痛苦,因此我決定逐一學習它,然后首先完成項目:P

由於我是MVVM的新手,所以我決定不使用MVVM Light,而是自己編寫所有樣板代碼。 當我完成每個部分的編碼時,我會遇到問題。

綁定視圖模型的位置最有效。 我讀了很多書,總結了以下幾點。

  1. 在App.xaml.cs中創建一個Model實例作為屬性,並在視圖的代碼背后進行綁定。(這是官方的Data Bound App示例的工作方式。)但是當面對很多視圖(6頁等)時),這可能是個問題。

     public partial class App : Application { private static MainViewModel viewModel = null; /// <summary> /// A static ViewModel used by the views to bind against. /// </summary> /// <returns>The MainViewModel object.</returns> public static MainViewModel ViewModel { get { // Delay creation of the view model until necessary if (viewModel == null) viewModel = new MainViewModel(); return viewModel; } } } 
  2. 在視圖后面的代碼中,將視圖模型的新實例作為全局變量創建。 因此,我可以在整個視圖中使用它。 (如上所述,我不做純MVVM)

  3. 在后面的代碼中,在構造函數中,執行一次綁定。

     public MainPage() { InitializeComponent(); myViewModel vm = new myViewModel(); DataContext = vm; } 

我閱讀了將ViewModelLocator用作中央站的mvvm light。 但是避免使用mvvm light,你們認為在哪里綁定viewmodel是最好的?

MVVM只是一種模式,不要使用純mvvm是可以的。 就個人而言(最終所有這些都取決於您的偏好),我認為選項3是理想的。

由於采用“視圖優先”方法,因此在Windows Phone中尤其如此。 我也不喜歡用視圖模型使應用程序代碼混亂的想法。 我認為背后的視圖代碼是設置和綁定視圖模型的自然位置。 一般來說,視圖模型應該用於一個視圖實例。 例如,我不想讓不同項目的明細頁面共享一個明細視圖模型,顯然它們會顯示相同的數據。 盡管視圖模型可以由多種類型的視圖使用,但通常不會將其用於多個視圖實例。

將其放在應用程序代碼中的唯一好處是,您可以從任何地方訪問視圖模型實例。 虛擬機“ a”需要告訴虛擬機“ b”進行刷新。 盡管我在拖放方案或子窗口中需要更多這些功能,但這在像這樣的移動平台中並不常見。 好消息是,如果您確實需要該功能,則仍不需要創建靜態視圖模型,則可以實現自己的視圖模型,也可以僅從mvvmlight中提取消息傳遞庫。

我現在在wp市場上有4個應用程序,並且我在后面的代碼中嘗試了視圖模型,如我對您的建議以及MVVM light和caliburn micro。 希望這可以幫助。

ViewModelLocator模式不限於MVVMLight。 對於此模式,您需要做的就是創建一個具有一組屬性的類。 這些屬性中的每一個都將返回視圖模型的實例。 在App.xaml文件的“資源”部分中,定義一個資源,該資源將創建此類的實例。 然后,在您的視圖中,將(DataContext的)“ Source”屬性設置為指向資源,例如Source = {StaticResource ....}”,並且路徑將是此StaticResource / Class上的屬性的名稱。實例。

在第一個示例中,您將接近遵循這種模式。 但是,您的App類充當ViewModelLocator,因為它公開了視圖模型的實例。 以與ViewModelLocator公開視圖模型的實例相同的方式。 區別在於您使用代碼隱藏而不是XAML直接綁定到此App.Property。

最簡單的選項是3。創建一個新實例,並將其分配給數據上下文。 但是,如果我是您,我將再次查看ViewModelLocator模式。 它實現了相同的目的,但是將視圖模型的管理和生命周期與視圖分開了。

我個人更喜歡在OnNavigatedTo處理程序中創建ViewModel。

我發現這是在調用構造函數之后被調用的最佳位置,並且它是導航參數可用的第一個位置。

顯然,在向后導航時,您必須小心不要調用此名稱(除非您的應用正在從邏輯刪除中恢復)-但這很容易檢查。

這正是我在MvvmCross中使用的生命周期OnNavigatedTo在Windows Phone和WindowsStore的OnNavigatedTo期間加載。


我也完全同意@Paul的回答

一般來說,視圖模型應該用於一個視圖實例

我個人不希望ViewModels持續存在於單例中,在app對象中,等等-每次創建View時,我只是創建一個ViewModel。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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