0

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

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

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

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

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");
}

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

4

1 回答 1

2

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

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


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

于 2009-06-19T14:49:59.490 回答