【问题标题】:C# function called after dependency property have been set设置依赖属性后调用的 C# 函数
【发布时间】:2010-03-15 16:39:06
【问题描述】:

我的代码目前如下所示:

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 中绑定的旧系统。

解决这个问题的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:
    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
    }
    

    【讨论】:

      【解决方案2】:

      这应该由分配给依赖属性的回调来处理。合适的地方取决于这里实际发生的事情:

      // Do stuff
      // Here be dragons
      

      three callbacks that can be assigned to a Dependency Property - 如果您只需要通知遗留系统,那么我建议添加Property Changed callback,并在那里添加通知。

      但是,如果这是通过 Legacy 系统执行的相当于验证的操作,则将这些龙放入 ValidationCallback. 可能更合适

      考虑到您的情况,我怀疑 CoerceValue 回调是否合适。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 2022-01-23
        相关资源
        最近更新 更多