使大型模型可观察



我正在进行我的第二个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个属性绑定到文本框:

<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,以便在代码更改项目时通知它。当然,你也可以手动收听,但通常不会。

您通常也不使用auto属性作为后备字段,但这可能是由于您的PropertyChanged实现。

现在这已经解决了:

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

为了回答您的另一个问题,您可以很容易地将其放在"模型"对象中,只要该对象可以用作DTO。换句话说,它实际上并没有以某种方式与模型绑定(比如说,具有模型功能),而是可以在层之间浮动。你甚至可以把INPC放在数据合同上,它不会伤害任何东西。

需要考虑的另一件事是,如果您只想在电机更改时通知UI,而不是其单独的属性,那么您只需在Motor属性上进行通知,所有绑定都将更新。

动态救援!

public class DynamicDictionary : DynamicObject, INotifyPropertyChanged
{
    private readonly Dictionary<string, object> dictionary;
    public DynamicDictionary(Dictionary<string, object> dictionary)
    {
        this.dictionary = dictionary;
    }
    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        return dictionary.TryGetValue(binder.Name, out result);
    }
    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        dictionary[binder.Name] = value;
        // magic!
        OnPropertyChanged(binder.Name);
        return true;
    }
    #region INPC implementation
    // SNIP!  I ain't writing all that junk out
    #endregion
}

(大部分代码都来自这个答案)

绑定可以像DynamicObject一样识别实现IDynamicMetaObjectProvider的类型,并知道如何使用它们。试试看。

最新更新