wpf如何判断数据绑定何时完成?

时间:2009-12-21 18:23:43

标签: wpf data-binding custom-controls dependency-properties

我有一个自定义控件,它有一个DependencyProperty MyAnimal - 我将ViewModel上的Animal属性绑定到MyAnimal DependencyProperty。

我在控件上粘贴了一个TextBox,所以我可以触发一个事件 - 每当我触发事件时MyAnimal属性已被设置 - 但是如果我在MyAnimal属性的Setter上放置一个断点,它永远不会被触发!

我想我错过了一些关于WPF依赖属性/绑定的基本内容?!

所以我的问题是,如果我不能使用Setter,我怎么能知道它何时被设置?如果我把如果我在InitializeComponent()之后放置一个断点,那么我看看是否有一个事件可以挂钩--DatabindingFinished或类似的?但看不出它会是什么......

有人可以帮忙吗?

谢谢,

安迪

public partial class ControlStrip
{
    public ControlStrip()
    {
        InitializeComponent();
    }

    public Animal MyAnimal
    {
        get
        {
            return (Animal)GetValue(MyAnimalProperty);
        }
        set
        {
            SetValue(MyAnimalProperty, value);
        }
    }

    public static readonly DependencyProperty MyAnimalProperty =
        DependencyProperty.RegisterAttached("MyAnimal", typeof (Animal), typeof (ControlStrip));

    private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
    {
        var myAnimal = MyAnimal;
        MessageBox.Show(myAnimal.Name);
    }

}

2 个答案:

答案 0 :(得分:5)

运行时永远不会调用setter方法。它们直接转到DependencyProperty。您需要在调用RegisterAttached()时添加一个额外的参数。在那里你可以添加一个PropertyChangedCallback。

以下是一些示例代码:

 public static readonly DependencyProperty MyAnimalProperty =
     DependencyProperty.RegisterAttached("MyAnimal", typeof (Animal), typeof (ControlStrip), new PropertyMetadata(AnimalChanged));

 private static void AnimalChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
 {
   // Do work here
 }

答案 1 :(得分:4)

setter仅供您使用 - 您实际上可以完全关闭该属性,因为DataBinding使用实际的DependencyProperty本身,而不是CLR属性。

如果您需要查看属性何时更改,则需要在依赖项属性上指定PropertyMetadata,并提供PropertyChangedCallback

有关详细信息,建议您阅读Dependency Property Metadata