【问题标题】:DependencyProperties where the value is not stored locally值未在本地存储的 DependencyProperties
【发布时间】:2009-06-19 14:43:18
【问题描述】:

我对为依赖于外部资源的属性创建 DependencyProperty 有点困惑。例如,在我正在编写的超声波应用程序中,我目前在托管 C++ 包装器中有以下内容(为了简单起见,此处翻译为 C#,实现 INotifyPropertyChanged):

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        NotifyPropertyChanged("Gain");
    }
}

我所有的代码都在 WPF 中使用,我正在考虑如何将 INotifyPropertyChanged 更改为 DependencyProperty,以及我是否会从这些更改中受益。大约有 30 个与这个类似的变量,其中大部分都被数据绑定到屏幕上的滑块、文本块或其他控件。

以下对于为此对象实现DependencyProperty 是否正确?

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        this.SetValue(GainProperty, value); 
    }
}

public static readonly DependencyProperty GainProperty = DependencyProperty.Register(
    "Gain", typeof(int), typeof(MyUltrasoundWrapper), new PropertyMetadata(0));

我从未见过不使用this.GetValue(GainProperty) 的示例。此外,还有其他功能可能会更改该值。这也是正确的改变吗?

public void LoadSettingsFile(string fileName)
{
    // Load settings...

    // Gain will have changed after new settings are loaded.
    this.SetValue(GainProperty, this.Gain);
    // Used to be NotifyPropertyChanged("Gain");
}

另外,附带说明一下,我应该期望在大多数属性是数据绑定的情况下获得性能提升,或者更确切地说,在许多参数不是数据绑定的情况下性能损失?

【问题讨论】:

    标签: c# wpf dependency-properties managed-c++


    【解决方案1】:

    使用依赖属性时,Get 和 Set 方法必须只是 this.GetValue() 和 this.SetValue() 的简单包装,原因是 WPF 不使用 getter 或 setter 来访问值,所以你不能一直依赖额外的代码运行。

    如果您确实需要将这些属性作为依赖属性,则创建一个标准依赖属性,该属性有效地缓存您的超音波。GetParam(prmGain) 结果并在 PropertyChanged 事件中调用超音波.SetParam(prmGain, value),该事件将可靠地称为 no无论属性如何更改。


    虽然我上面写的内容仍然正确,但重读您的问题让我认为您可能误解了依赖属性是什么。如果此 C++ 包装器对象实际上是您的模型,那么您希望保留 INotifyPropertyChanged。依赖属性旨在供 WPF 控件在内部使用,以促进绑定并降低控件的内存占用。它们不应该在数据提供者内部使用,这就是通知接口的用途。

    【讨论】:

    • 这就是我在执行 SetValue 时传入 this.Gain(调用超声.GetParam)的原因,以及在手动设置值的情况下传入的值。我认为上面的逻辑将始终保持最新的本地版本 Gain。
    • 我认为您可能会接受价值的获取。我担心的是设置。当通过 WPF 绑定设置值时,它不会调用 Set,因此超音波.SetParam(prmGain, value);不会被调用,并且超声波对象中的值不会被更新。绑定不调用 get 或 set,它直接作用于依赖属性本身。
    • 您可能是对的,我想太多了,我应该将其保留为 INotifyPropertyChanged。我只将 INotifyPropertyChanged 实现为一种将数据绑定到 WPF 的工具,所以我认为 DependencyProperties 可以加快速度,但它们不是局部变量的事实使得保持数据同步变得不必要地复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多