【问题标题】:DependencyProperty / INotifyPropertyChanged on low level objectsDependencyProperty / INotifyPropertyChanged 在低级对象上
【发布时间】:2011-12-07 09:33:44
【问题描述】:

我有一些相当低级的类用于我正在处理的 WPF 应用程序中。例如,一个对象表示将在 ScrollViewer 中显示为列表并与 DataTemplate 一起显示的对象。绑定对 UI 中使用的几个属性非常有效,我使用这个对象纯粹是因为它很方便传递给 UI。问题是 UI 没有收到数据更改的通知,因为它没有实现 INotifyPropertyChanged 或 DependencyProperty。

提到的类旨在成为可以完全独立于 UI 使用的库的一部分,所以我担心它会被 UI 特定的东西弄乱(尤其是 INPC,那是一堆疯狂的代码对于这样的小事)。

在这种情况下,通常会做些什么,用 UI 杂乱无章的东西把低级类弄乱,或者为 UI 创建一个包装类。还是有其他选择?

【问题讨论】:

  • 就个人而言,我可能会编写一个包装器,但我不知道这是否是最佳选择。

标签: c# .net wpf user-interface mvvm


【解决方案1】:

为了实现良好的分离,我将创建一个包装您的库类的类。包装器将实现 INotifyPropertyChanged 接口并公开在更新时触发 PropertyChanged 事件的公共属性。包装器将从被包装的类中获取并设置实际值...

public class Internal
{
    public int MyProperty { get; set; }
}

public class WrapperForInternal : INotifyPropertyChanged
{
    public event PropertyChanged(object sender, PropertyChangedEventArgs e);

    private Internal _i;
    public WrapperForInternal(Internal i)
    {
        _i = i;
    }

    public int MyProperty
    {
        get { return _i.MyProperty; }
        set
        {
            _i.MyProperty = value;
            RaisePropertyChanged("MyProperty");
        }
    }

    protected void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

或者,您可以从 Internal 类派生并添加接口和触发事件的额外属性。但我更喜欢自己完全分离。

【讨论】:

  • 嗯,问题的一部分是由于工作线程在一些较低的代码中运行,底层类中的值可能会发生变化......所以我猜 PropertyChanged 事件不会在那种情况下被解雇?
  • 在这种情况下,我建议您将内部属性 MyProperty 设为虚拟,然后继承一个实现 INotifyPropertyChanged 的​​类。同时覆盖 MyProperty,以便在更新时触发更改事件。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2010-10-27
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
相关资源
最近更新 更多