簡體   English   中英

一個ViewModel和多個視圖

[英]One ViewModel and multiple views

我對Windows Phone 8和MVVM模式有一些疑問。

  1. 我想知道如何將許多顯示頁面中的元素綁定到一個ViewModel(只有一個ViewModel,因為我想使用Facade模式)。

  2. 我看到的每個教程都包含ViewModel和Model在靜態字段中的代碼。 我不確定這是否正確。 有人可以告訴我在WP8應用程序中應該創建新模型和ViewModel來做到這一點嗎? (“右”我的意思是我可以將多個頁面中的元素綁定到這個ViewModel。)我正在考慮App.xaml.cs文件,但仍然不確定。

謝謝你的幫助!

我最近一直困擾着類似的問題。 最后,我使用App.xaml.cs創建了viewmodel。

答案

是的,這是在App.xaml.cs中創建靜態視圖模型的正確方法,因為App類可以從應用程序中的任何頁面訪問,將它們聲明為靜態也是正確的,因為您將要訪問它沒有創建App的實例,而且正如Tariq在他的回答中寫道:

ViewModel和Model是靜態字段,因此如果超出范圍,則不會銷毀這些值。 這進一步使得可以從多個頁面輕松更新。

編輯:請注意,當您在頁面之間瀏覽並導航回來時,一旦您返回內存中的頁面,綁定就不會自動恢復。

如何

我將此添加到RootFrame定義旁邊的App.xaml.cs中:

private static MainViewModel viewModel; //not sure how your viewmodel class is named
public static MainViewModel ViewModel   //and a property to access it from
{
  get
  {
    if(viewModel == null)               //which creates the viewModel just before
       viewModel = new MainViewModel(); //it's first used
    return viewModel;
  }
}

當我想在頁面中綁定一些內容時,jst將其添加到頁面的構造函數中(在 InitializeComponents(); ):

 
 
 
  
  DataContext = App.ViewModel;
 
  

如果你想綁定,你最好在OnNavigatedTo()設置綁定(假設它的構建資源不是太昂貴 - 如果它需要花費的時間或資源超過一些,你應該考慮重新處理你的ViewModel,以便它隨着時間的推移而加載) 。

只需將此添加到您的頁面:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);             //not needed, base method is empty and does nothing
        DataContext = null;                //important part, whenever you navigate, refreshes the ViewModel - no deletion, just resetting of the DataContext, so the page won't get stuck
        DataContext = App.ViewModel;      //and finally the resetting
    }

要解釋這段代碼的作用以及我編輯代碼的原因如下:

  • 在制作我的應用程序時,我一直在關注自己的應用程序內導航,例如反向瀏覽 - 當我按下硬件后退按鈕並進入上一個站點時,值保持不變,即使我在頁面中更改了它我從后面瀏覽過。 它們在模型中很好,但在“反向瀏覽”時沒有正確綁定。

當我試圖解決它時,它最終來到我身邊。

您需要做的就是刷新綁定:

  • 再次設置它,並且由於在瀏覽時不調用頁面的構造函數,因此刷新它的唯一地方是OnNavigatedTo()事件。

  • 我測試了它,它的工作原理

(因此,當創建第一個頁面並嘗試綁定數據時,視圖模型僅通過get請求自動創建:))

在xaml中,我可以綁定:

<TextBlock text="{Binding SomePropertyNameFromViewModel}" />

要么

<TextBlock text="{Binding SomeModelInViewModel.ItsProperty}" />

或者例如:

<ListBox IemSource="{Binding SomeCollectionInViewModel}">
...rest omitted for brevity...

等等...

最棒的是什么? 它的工作原理很簡單。 我將它用於ViewModel,包含幾個命令和大約6或7個模型,其中包含用於綁定的屬性和集合,當用戶通過應用程序並指定要加載的內容時,這些模型會被填充。

PS:從我得到的這個方法來做到這一點,即使是基本的WP pivot應用程序也是這樣做的。

你可以檢查自己是否創建一個空的數據透視應用程序,看看App.xaml.cs ,將會有一個像這樣創建的視圖模型。 它可以從每個頁面訪問。

我不是很有經驗,但是我做了什么工作::

是的,您可以使用App.xaml.cs文件從多個頁面訪問ViewModel。 ViewModel將從所有頁面接收更新。 這就是它的美麗!

ViewModel和Model是靜態字段,因此如果超出范圍,則不會銷毀這些值。 這進一步使得可以從多個頁面輕松更新。

暫無
暫無

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

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