我的代码目前看起来像这样:
private Foo myFoo;
public Foo CurrentFoo
{
get { return myFoo; }
set { SetFoo(value); }
}
private void SetFoo(Foo newFoo)
{
// Do stuff
// Here be dragons
myFoo = newFoo;
}
为了能够在XAML / WPF中绑定它,我需要将Foo
转换为依赖属性:
public static DependencyProperty CurrentFooProperty =
DependencyProperty.Register("CurrentFoo", typeof(Foo),
typeof(FooHandler), new PropertyMetadata(false));
public Foo CurrentFoo
{
get { return (Foo)GetValue(CurrentFooProperty); }
set { SetValue(CurrentFooProperty, value); }
}
我听说你不应该在实际的C#属性集{}中做魔法,因为它可能没有被调用但是值直接写入依赖属性。如果这是假的,请告诉我,这似乎是最明显和最简单的路线。
我知道我可以在依赖属性中添加验证函数,但我认为它不应该用于此吗?我需要将更改传达给尚未绑定在XAML中的遗留系统。
解决此问题的最佳方式是什么?
答案 0 :(得分:4)
public static DependencyProperty CurrentFooProperty = DependencyProperty.Register(
"CurrentFoo",
typeof(Foo),
typeof(FooHandler),
new PropertyMetadata(OnCurrentFooChanged));
private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var currentFoo = (Foo) e.NewValue;
// Use
}
答案 1 :(得分:1)
这应该由分配给Dependency Property的回调处理。适当的地方取决于这里实际发生的事情:
// Do stuff
// Here be dragons
有three callbacks that can be assigned to a Dependency Property - 如果您只需要通知旧版系统,那么我建议您添加Property Changed callback,并在那里添加通知。
但是,如果这通过Legacy系统执行相当于验证的内容,那么将这些龙放入ValidationCallback.
可能更合适考虑到你的场景,我怀疑CoerceValue回调是否合适。