我对 BindableBase 类的用法以及如何将这种"new"机制应用于经典 MVVM 设计感到有点困惑。
简而言之,问题如下:当我们在 View 模型类中引用模型时,如何正确使用 BindableBase 类?
详细信息:
经典的 MVVM 模式:View <-> View-Model -> Model
正如我们在该方案中看到的 View-Model 了解 Model,但 Model 对 View 和 View-Model 一无所知。
如果我们实现这种方法,我们将得到类似这样的东西:
// Model
class Task
{...}
// View-Model
class TaskViewModel : BindableBase
{
private readonly Task _task;
public TaskViewModel(Task task)
{
_task = task;
}
...
}
假设 Task 类具有“Subject”属性,我们应该显示此数据。所以根据 MVVM 我应该:
在 View 模型中创建“Subject”属性的副本:
// View-Model
class TaskViewModel : BindableBase
{
public String Subject
{
get{ return _task.Subject; }
set
{
_task.Subject = value;
// I can't use SetProperty(ref _task.Subject, value)
// it's contradict c# syntax
OnPropertyChanged("Subject");
}
}
}
如您所见,我不能将 SetProperty 方法用于此类设计,并且它是调用原始 onPropertyChanged 方法的唯一方法。
SetProperty 似乎是 BindableBase 类的最大好处,我们不能在 MVVM 如此直接和通用的实现中使用它,这很奇怪。所以我想也许我错过了一些东西或者在指定的类上工作不正确。
您知道如何使用 BindableBase 进行指定设计并获得一些代码改进吗?
谢谢
最佳答案
目前,您的 ViewModel
正在暴露Model
View
的属性.这很好但是如果你的Model
就变得很荒谬了有很多属性需要公开。您能想象必须为 Model
创建属性吗?有 20 多个属性?
相反,您应该公开 Model
到 View
在你的 ViewModel
中使用一个属性 .
public MyClass Model { get; private set; }
注意:这也可以实现 INotifyPropertyChanged
.
以及您的 Model
中的属性应该实现 INotifyPropertyChanged
,或者在你的情况下,BindableBase
.
public class MyClass : BindableBase
你的 View
然后可以直接绑定(bind)到 Model
属性(property)。这可能看起来像你打破了设计模式,但事实并非如此,你的 View
仍然对你的Model
一无所知,但是它只是对它期望的属性做出假设,因此您的类仍然是解耦的。
这里唯一的缺点是您的 Model
现在取决于 BindableBase
,这不是世界末日,但如果您处于无法修改 Model
的情况类,那么您当前的方法就是要走的路。
关于c# - BindableBase 在经典 MVVM 设计中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32867170/