首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现多个INotifyPropertyChanged

实现多个INotifyPropertyChanged
EN

Stack Overflow用户
提问于 2014-04-17 21:07:10
回答 2查看 111关注 0票数 1

请告诉我实现许多重复INotifyPropertyChanged的最佳方法。我有一个MainClass,它有10个子字段,每个子字段都有6个字段,并且当自己的值发生变化时,每个字段都必须触发属性更改。这是我的代码,但不起作用:

代码语言:javascript
复制
    public class BaseModel
{

    public string S1 { get; set; }
    public string S2 { get; set; }
    public string S3 { get; set; }
    public string S4 { get; set; }
    public string S5 { get; set; }
    public string S6 { get; set; }
}

我使用一个名为ViewModelBase的类来实现INotifyPropertyChanged。在第二步中,使用类实现重复的INotifyPropertyChanged:

代码语言:javascript
复制
    public class ImplementBaseModel : ViewModelBase
{
    private readonly BaseModel _baseModel;
    public ImplementBaseModel()
    {
        _baseModel = new BaseModel();
    }

    public string S1
    {
        get { return _baseModel.S1; }
        set
        {
            if (_baseModel.S1 == value)
                return;

            _baseModel.S1 = value;
            base.OnPropertyChanged("S1");
        }
    }
    public string S2
    {
        get { return _baseModel.S2; }
        set
        {
            if (_baseModel.S2 == value)
                return;
            _baseModel.S1 = value;
            base.OnPropertyChanged("S2");
        }
    }
    // other code...

}

然后,一个模型有10个这类:

代码语言:javascript
复制
    public class MidClass
{
    public ImplementBaseModel ImplementBaseModel1 { get; set; }
    public ImplementBaseModel ImplementBaseModel2 { get; set; }
   // other field
    public ImplementBaseModel ImplementBaseModel10 { get; set; }

    public MidClass()
    {
        ImplementBaseModel1 = new ImplementBaseModel();
        ImplementBaseModel2 = new ImplementBaseModel();
        // ....
        ImplementBaseModel10 = new ImplementBaseModel();

    }
}

好的,完成代码!现在请告诉我为什么有些房产在价值变化时不会被炒鱿鱼?是实现此代码的最佳方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-17 21:10:14

在你的策划者中,你从来没有真正地设置过这个值。使用:

代码语言:javascript
复制
public string S1
{
    get { return _baseModel.S1; }
    set
    {
        if (_baseModel.S1 == value)
            return;
        baseModel.S1 = value;
        OnPropertyChanged("S1");
    }
}

请注意,我从base中删除了OnPropertyChanged。以这种方式调用PropertyChanged事件是不正常的。

NotifyPropertyChanged所做的就是使每个绑定都对其绑定属性执行"get“。如果备份字段从未更新,它们将只获得相同的数据。

票数 2
EN

Stack Overflow用户

发布于 2014-04-17 21:48:15

作为快捷方式,您还可以创建一个本地方法,如

代码语言:javascript
复制
bool UpdateAndRaiseIfNecessary( ref string baseValue, string newValue, [CallerMemberName] string propertyName = null)
{
    if (baseValue != newValue)
    {
        baseValue = newValue;
        OnPropertyChanged( propertyName );
        return true;
    }

    return false;
}

然后所有的策划者都是这样的:

代码语言:javascript
复制
set
{
    this.UpdateAndRaiseIfNecessary( ref _baseModel.S1, value );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23143462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档