gpt4 book ai didi

c# - 在 MVVM Light 中独立更改模型时更新 View 的最佳实践

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:46 26 4
gpt4 key购买 nike

我正在开发一个实现 MVVM light 的应用程序。该应用程序是基于网络的,可以随时接收数据,这将更改 Model 中的值。

MVVM light 中推荐的方法是什么,用于通知 ViewModels Model 中的数据已更改(来自触发的事件View 或 ViewModel)并且应该更新 View?

最佳答案

我将从 MVVM Light 中抽象出来,并尝试展示一个适合 MVVM 风格的通用解决方案。


Notifying ViewModels that data in the Model has changed

您在 ModelViewModel 中的属性必须实现 INotifyPropertyChanged界面。他有一个事件 PropertyChangedEventHandler(propertyName) 通知通知属性:

public class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

假设,我们有这个实现模型的接口(interface):

public class MyModel : NotificationObject
{
private string _text = "";

public string Text
{
get
{
return _text;
}

set
{
_text = value;
NotifyPropertyChanged("Text");
}
}
}

然后,要知道此属性何时更改,请在构造函数中为 ViewModel 创建一个事件处理程序:

public MyViewModel() 
{
MyModel = new MyModel();
MyModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(MyModel_PropertyChanged);
}

private void MyModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName.Equals("Text"))
{
System.Diagnostics.Debug.WriteLine("Text changed");
}
}

From an event which was not triggered by the View or ViewModel

如果这个事件没有发生在View或者ViewModel中,那么MVVM的风格怎么用他呢?在模型中,此事件不应完全触发,因为应该只触发 INotifyPropertyChanged 接口(interface)的属性和最大实现。

无论如何,我建议您在 ViewModel 中处理此事件 - 对他来说这是个好地方。你不应该认为这些数据会通过网络或用户更新,尽量找到不依赖于实现的最抽象的解决方案。您可以创建一个带有接口(interface)的类助手,它将使用网络并在 ViewModel 一侧调用它,例如在 Command 中。

关于c# - 在 MVVM Light 中独立更改模型时更新 View 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22520018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com