如何在WPF依赖项属性中使用程序化的“get”等效项?

时间:2017-06-07 04:52:43

标签: c# wpf dependency-properties getter

这是写一个属性的clr方式:

public byte Value
{
   get{
     return GetByteData();
   }
   set{
     SetByteData(value);
   }
}

我已经阅读了如何对依赖属性方法做同样的事情,这就是我自己可以做的所有事情:

public byte Value
{
    get { return (byte)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
    "Value", typeof(byte), typeof(MyControl),
    new FrameworkPropertyMetadata((byte)0, ValueChanged));

public static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    byte r = (byte)e.NewValue;
    MyControl v = (MyControl)d;
    v.SetByteData(r);
}

通过我看过的示例,从中我已经制作了上面的代码片段,我找不到放置GetByteData()的位置,{{1}}计算当前UI状态的输出值用户进行交互,以便更新“价值”。

直到之前我把它放在吸气器中,无论如何都像clr一样,但我觉得这是错误的做法,但我可能是错的。我应该把它放在哪里?如果没有,我的方法应该是什么?是否可以为依赖属性设置编程getter?

我可能一直在使用错误的关键字来寻找解决方案。任何帮助我正确的方向将非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

只要它只是Binding的源(而不是目标)属性,就像在

中一样
{Binding Value, ElementName=MyControlName}

并且您不希望通过样式设置器应用值,或者为该值设置动画,该属性不需要是依赖项属性。

只需像这样实施INotifyPropertyChanged

public partial class MyControl : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public byte Value
    {
       get { return GetByteData(); }
       set
       {
           SetByteData(value);
           PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
       }
    }

    ...
}