代码之家  ›  专栏  ›  技术社区  ›  Will Eddins ianpoley

非本地存储值的DependencyProperties

  •  0
  • Will Eddins ianpoley  · 技术社区  · 16 年前

    我对创造一个 DependencyProperty 对于依赖外部源的属性。例如,在我正在编写的一个超声应用程序中,我现在在一个托管C++包装器中有以下内容(在这里简单地转换为C语言,实现NoItIFYPrimTyTrchange):

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

    我的所有代码都在WPF中使用,我正在考虑如何更改 INotifyPropertyChanged 关联属性 如果我能从这些变化中获益的话。有大约30个与此类似的变量,其中大多数都将数据绑定到屏幕上的滑块、文本块或其他控件。

    以下内容是否适用于实现 关联属性 为了这个目标?

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

    另外,顺便说一句,在大多数属性都是数据绑定的情况下,我应该期望性能提高,或者更确切地说,在许多参数没有数据绑定的情况下,应该期望性能降低?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Martin Harris    16 年前

    当使用依赖属性时,get和set方法必须只是这个.getValue()和这个.setValue()的简单包装器,原因是wpf不使用getter或setter访问该值,因此您不能依赖一直运行的额外代码。

    如果您确实需要这些属性作为依赖属性,那么创建一个标准的依赖属性,该属性可以有效地缓存您的超声波。getParam(prmgain)result并在PropertyChanged事件内调用超声波。setParam(prmgain,value),无论该属性如何更改,都将可靠地调用它。


    虽然我上面写的仍然是正确的,重读你的问题让我觉得你可能误解了什么是依赖属性。如果这个C++包装对象有效地是你的模型,那么你想留在IntIfyPrimyType中。依赖属性设计为在内部由WPF控件使用,以方便绑定并降低控件的内存占用。它们不应该在数据提供者内部使用,这就是通知接口的作用。