【发布时间】:2017-06-07 04:52:42
【问题描述】:
这是写属性的 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);
}
通过我查看的示例,我从中制作了上面的 sn-p,我找不到放置 GetByteData() 的地方,它计算当前 UI 状态的输出值用户交互,从而更新“价值”。
直到之前我还是像使用 clr 一样将它放在 getter 中,但我觉得这是错误的方法,但我可能是错的。我应该把它放在哪里?如果没有,我的方法应该是什么?是否有可能为依赖属性提供程序化的 getter?
我可能一直在使用错误的关键字来寻找解决方案。任何帮助我朝着正确的方向前进将不胜感激。提前致谢。
【问题讨论】:
-
不幸的是,依赖属性没有“获取回调”。它们的 getter 始终且仅返回先前设置的值(直接或通过绑定、样式、默认值等)。为什么你的属性必须是依赖属性?
-
还要注意,PropertyChangedCallback 中的分配
v.Value = r是多余的。该属性已经具有该值。我已将其从您的示例代码中删除。 -
哦!完全不同的方法!所以这意味着我必须通过在用户交互时触发事件来更新依赖值?我想每次都会使用
SetByteData来同步用户界面。有点多余,但我想我可以使用状态变量让它跳过重做。 @为什么它需要依赖:我需要一个不同的 UI 元素来做:{Binding Value, ElementName=MyControlName}。我不确定这是否适用于 clr 属性...
标签: c# wpf dependency-properties getter