[英]One ViewModel and multiple views
我對Windows Phone 8和MVVM模式有一些疑問。
我想知道如何將許多顯示頁面中的元素綁定到一個ViewModel(只有一個ViewModel,因為我想使用Facade模式)。
我看到的每個教程都包含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.