2013-05-14 103 views
1

我在Windows Phone 7.5及更高版本的項目(6頁)上工作。我不做純MVVM模型,因爲處理導航事件和查詢字符串是一件很痛苦的事情,所以我決定逐個學習,並且首先完成項目:P何處將ViewModel綁定到視圖?

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

在哪裏綁定視圖模型是最有效的。我讀了很多,並總結了以下幾點。

  1. 在App.xaml.cs作爲屬性創建模型的實例,並在視圖中的代碼隱藏的約束力。(這是官方數據如何結合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; 
    } 
    

我讀MVVM光它們使用ViewModelLocator作爲中心站。但是避免使用mvvm light,在哪裏綁定視圖模型,你認爲是最好的嗎?

+0

您也可以在App.xaml或SomePage.xaml中將其定義爲資源,然後將DataContext綁定到該資源,以便您甚至不需要任何代碼。現在你有5個選項。 :)將其保留在App.xaml.cs中的好處之一是,您可以在不同視圖之間共享相同的VM實例 - 如果這是您所需要的。 – 2013-05-14 13:52:04

+0

感謝@igrali現在我知道什麼時候將視圖模型放在App部分:) – 2013-05-14 14:47:30

回答

0

MVVM只是一種模式,可以不使用純粹的mvvm。個人(最終這一切都歸結於您的偏好)我認爲選項3是理想的。

由於視圖優先方法,在windows phone中尤其如此。我也不喜歡用視圖模型混淆我的應用程序代碼的想法。我認爲背後的視圖代碼是一個更自然的位置來設置和綁定視圖模型。一般來說,視圖模型應該是一個視圖的一個實例。例如,我不想爲具有共享一個詳細視圖模型的不同項目的詳細頁面顯然他們會顯示相同的數據。雖然視圖模型可以被多種視圖使用,但它通常不會用於視圖的多個實例。

我可以看到把這個放在應用代碼中的唯一好處是你可以從任何地方訪問你的視圖模型實例。 VM「a」需要告訴vm「b」刷新。這在這樣的移動平臺中並不常見,儘管我更需要拖放場景或子窗口。好消息是,如果您確實需要這種功能,您仍然不需要製作靜態視圖模型,您可以實現自己的視圖模型,或者僅從mvvmlight中獲取消息傳遞庫。

我現在在wp marketplace中有4個應用程序,我已經在代碼背後嘗試了視圖模型,正如我爲您推薦的,以及MVVM light和caliburn micro。希望這可以幫助。

0

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

在你的第一個例子中,你接近遵循這種模式。但是,您的App類充當ViewModelLocator,因爲它暴露了視圖模型的一個實例。與ViewModelLocator公開視圖模型的實例的方式相同。不同之處在於你使用代碼隱藏而不是使用XAML直接綁定到這個App.Property。

最簡單的選項是3.創建一個新實例並將其分配給數據上下文。但是如果我是你,我會再次查看ViewModelLocator模式。它實現了同樣的功能,但是它將視圖模型的管理和生命週期從視圖中分離出來。

0

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

我覺得這是最好的地方,因爲它在調用構造函數之後被調用,並且它是導航參數可用的第一個地方。

很明顯,您必須小心,不要在向後導航時調用此方法(除非您的應用正在從墓碑恢復) - 但這很容易檢查。

這正是我在MvvmCross中使用的生命週期--WindowsPhone和WindowsStore上的OnNavigatedTo期間加載ViewModel。


我還@完全同意保羅的回答是

一般來說視圖模型應該是一個視圖的一個實例

我個人不喜歡看的ViewModels堅持單身,在應用程序對象等 - 我只是創建一個ViewModel每次創建一個視圖。

相關問題