"Soft updating" DependencyProperties?

本文关键字:quot DependencyProperties Soft updating | 更新日期: 2023-09-27 18:15:08

我有一个WPF应用程序,使用INotifyPropertyChanged来信号属性更新。我喜欢它的地方在于,它使您能够在不调用所有setter代码的情况下发出属性更改的信号。当你有两个相互更新的链接字段,或者当你的代码在每个setter上保存更改,并且你不想为用户的一次更改触发多次保存时,这是很方便的。

然而,这种方法的明显弱点是,属性名称或发送通知的视图模型中的错误将使您陷入困境,并且只显示和运行时。

我查看了依赖属性,但没有找到任何可以让你做"软更新"的东西:让UI知道属性已经更改,但避免调用当UI导致视图模型更改时通常会运行的所有代码。

有一些方法我可以得到一个属性系统,允许软更新和捕获通知问题在编译时?

"Soft updating" DependencyProperties?

如果潜在的问题是属性名中的错误,则有编译时的解决方案,例如将"属性名"参数设置为表达式树而不是字符串。

http://michaelsync.net/2009/04/09/silverlightwpf-implementing-propertychanged-with-expression-tree

这份原稿。微库也在它的PropertyChangedBase类中包含了这种方法。

我喜欢Foson针对属性名称的"早期绑定"解决方案,并且不需要保留属性名称的字符串副本。这是我个人使用的实现核心:

    public virtual string GetName<T>(Expression<Func<T>> expression)
    {
        return GetMemberName(expression);
    }
    /// <summary>Abstraction for actually finding the name of the target of the expression</summary>
    private static string GetMemberName<T>(Expression<Func<T>> expression)
    {
        if (expression != null)
        {
            var myMemberExpression = expression.Body as MemberExpression;
            if (myMemberExpression != null && myMemberExpression.Member != null)
            {
                return myMemberExpression.Member.Name;
            }
        }
        return string.Empty;
    }

此代码驻留在一个名为namesolver的类中,我的ViewModelBase类使用

对其进行包装。
  NotifyChange(Expression<Func<T>> expression)

客户端代码看起来像这样:

private int _myBindable;
public int MyBindable { get { return _myBindable; } set { _myBindable = value; NotifyChange(() => MyBindable); }

至于将GUI通知与更新底层内容分离的概念,当代码中发生应该触发UI更新的任何事情发生时,您可以调用那些NotifyChange()方法而不是属性设置器。GUI设置你的属性,它触发一些逻辑,但你不在那里引发更改通知,你从任何地方引发它,具体来说,你想要通知UI一些事情。