c# - BindableBase 在经典 MVVM 设计中的使用

标签 c# wpf mvvm

我对 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 多个属性?

相反,您应该公开 ModelView在你的 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/

相关文章:

c# - 为嵌套属性实现 INotifyPropertyChanged

c# - WPF HTTPWebRequest 底层连接已关闭 : An unexpected error occurred on a receive

c# - WPF Visual Studio 调试 - 控制台

c# - 使用反射获取特定键的字典完整路径

C# 泛型方法问题,TargetException,对象与目标类型不匹配

c# - 设置 MaxTextWidth 时出现 WPF 字对齐问题

javascript - knockout JS 绑定(bind)到对象的属性

c# - MVVM 良好的设计。数据集或 RowViewModel

c# - ASP.NET MVC 3 Url.Action匹配

c# - 按钮内的图像和标签在单击事件 wpf 上更新