c# - 使大型模型可观察

标签 c# wpf

我在我的第二个 WPF 项目中遇到了一个不舒服的情况。这是我的模型:

public class Layout
{
    public string Name { get; set; }
    public Motor Motor { get; set; }
}

public class Motor
{
    public string Property1 { get; set; }
    ...
    public string Property150 { get; set; }
}

这是我的 MainViewModel:

public class MainViewModel : ViewModelBase
{
    public Motor Motor {get; set;}
    ...
}

好的,我已经将电机类的所有 150 个属性绑定(bind)到文本框:

<TextBox Text="{Binding Layout.Motor.Property1}"/>

问题 1) 如果我想在用户更改其中一项时触发操作,我是否必须执行 150 次?

    private string property1 { get; set; }
    public string Property1
    {
        get { return property1; }
        set
        {
            property1 = value;
            RaisePropertyChanged(() => Property1);
        }
    }

问题 2) 我必须在 MainViewModel 中,在模型“Motor”中实现它还是需要一个“MotorViewModel”?这些中的任何一个都意味着大量的复制和粘贴以及完全无用的编码。

感谢您的帮助和反馈!

最佳答案

首先,RaisePropertyChanged 确实用于 UI,在 code 更改项目时通知它。当然,您也可以手动监听它,但通常不会这样做。

您通常也不使用自动属性作为支持字段,但这可能是由于您的 PropertyChanged 实现所致。

现在已经不在了:

是的,您需要实现它,或者类似的东西,允许 PropertyChanged 提高 150 倍。现在,有人想知道为什么您有 150 个属性在一个对象上,所以你可能想先重新考虑那个设计。但如果你真的需要它们,那么是的,复制粘贴是你的 future 。考虑编写代码片段以使其运行速度更快。

要回答您的其他问题,您可以轻松地将它放在“模型”对象中,只要该对象可以用作 DTO。换句话说,它实际上并没有以某种方式(例如,具有模型功能)绑定(bind)到模型,而是可以在层之间 float 。您甚至可以将 INPC 置于数据契约(Contract)中,这不会造成任何伤害。

还有一件事需要考虑,如果您只想在 motor 发生变化时通知 UI 而不是它的各个属性,您可以只在 Motor 属性上通知所有绑定(bind)都将更新。

关于c# - 使大型模型可观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29548926/

相关文章:

c# - WPF ListView 通过标题模板与扩展器分组?

c# - 与多个实体的模型绑定(bind)

c# - 如何使用 html 敏捷包在 c# 中获取 html 文档的 html 元素的 id?

c# - 使用 BackGroundWorker 运行 WatiN 打开 IE 浏览器

c# - 为什么VS2017说await是一个未知关键字?

wpf - 可观察集合未在 UI 更改时更新

html - WPF 中 HTML 类 ID 的等价物是什么?

wpf - 如何从代码隐藏设置图像资源 URI

c# - Windows 应用程序 : Best Practices & Patterns (C#/WPF/LINQ)

c# - 带有 Contains 的 Linq 查询仅适用于 IQueryable 位于外部变量中