这是写一个属性的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?
我可能一直在使用错误的关键字来寻找解决方案。任何帮助我正确的方向将非常感激。提前谢谢。
答案 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)));
}
}
...
}