我正在開發一個應用程式,并試圖盡可能地遵循MVVM,因此有許多帶有相應ViewModes的視圖。我正在反序列化一個ViewModel,這個ViewModel是用XAML實體化到視圖中的。例如,如果視圖被稱為 "ExampleView",而ViewModel被稱為 "ExampleViewModel"。ViewModel是通過以下方式在ExampleView中實體化的......
<UserControl.Resources>
<local:ExampleViewModel x:Key="ViewModel"/span> />
</UserControl.Resources>
用下面的代碼從視圖中獲取/設定ViewModel(通常這只是一個獲取,但我嘗試用set來設定反序列化后的ViewModel)。
public ExampleViewModel ViewModel
{
get { return (ExampleViewModel)this.Resources["ViewModel"/span>]; }
set.
{
if (this.Resources["ViewModel"]! =value)
{
this.Resources["ViewModel"] = value;
}
}
}
這并不奏效,但我認為原因是PropertyChanged沒有被觸發。所以在ExampleViewModel中我加入了一個方法來重繪 每個屬性。例如...
public void RefreshAllProperties()
{
NotifyPropertyChanged("Property1"/span>)。
NotifyPropertyChanged("Property2")。
...
}
其中NotifyPropertyChanged是...
private void NotifyPropertyChanged([CallerMemberName] string PropertyName = ")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName))。
雖然這沒有通過代碼嗅覺測驗,但我在尋找更優雅的東西的程序中試圖理解。然而,我驚訝地發現它并不奏效。
我希望在 XAML 中保持 ViewModel 的實體化。在反序列化之后,是否有一個最佳實踐來重新實體化 ViewModel?
修改后的問題
對于將 ViewModel 的創建轉移到 View 類的建構式中,有什么意見嗎?這是否是一種更好的設計模式?
ExampleViewModel exampleViewModel。
public ExampleView()
{
InitializeComponent()。
ExampleViewModel = new ExampleViewModel()。
this.DataContext = ExampleViewModel;
}
public ExampleViewModel ViewModel
{
get { return exampleViewModel; }
set
{
if (exampleViewModel! =value)
{
exampleViewModel = value;
NotifyPropertyChanged()。
}
}
}
uj5u.com熱心網友回復:
我以前沒有見過定義在ResourceDictionary中的ViewModel。我傾向于在后臺代碼中初始化我的ViewModels(我知道你提到你想把它放在XAML中),因為我可以更直接地控制頁面的DataContext和它最終的更新時間(比如在你的例子中的反序列化后)。在運行時修改 ResourceDictionary 似乎是一種危險的方法,WPF 中的 ResourceDictionary 沒有實作 INotifyPropertyChanged 或任何其他更改介面,如 INotifyCollectionChanged,這意味著它不會通知任何東西,其鍵值對之一已經以某種方式改變。
綜上所述:我的答案是不要在 ResourceDictionary 中定義您的 VM,而是在您的頁面代碼后臺中管理它,您可以確保在 VM 或其狀態發生變化時適當地更新 DataContext。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/307897.html
標籤:
