已设置依赖项属性后调用的C#函数

时间:2010-03-15 16:39:06

标签: c# data-binding xaml dependency-properties

我的代码目前看起来像这样:

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中的遗留系统。

解决此问题的最佳方式是什么?

2 个答案:

答案 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回调是否合适。