WPF - DependencyProperty的PropertyChangedCallback中的GetBindingExpression

时间:2015-04-13 15:08:38

标签: c# wpf xaml binding

我需要能够从TextBox上的DependencyProperty中访问TextBox的Text属性的绑定表达式。我的DependencyProperty的值在XAML中设置。我在DependencyProperty的GetBindingExpression方法中调用了PropertyChangedCallback,但是我现在太早了,因为GetBindingExpression总是在这里返回null,但是在窗口完全加载后它肯定会返回一个值(我使用屏幕上的按钮测试来改变我的DependencyProperty的值)。

显然我在这里有一个加载顺序问题,其中我的DependencyProperty的值在Text属性绑定到我的视图模型之前设置。我的问题是,是否有一些事件可以挂钩以确定Text属性的绑定何时完成?最好不要修改我的TextBox的XAML,因为我在解决方案中有数百个。

public class Foobar
{
    public static readonly DependencyProperty TestProperty =
        DependencyProperty.RegisterAttached(
        "Test", typeof(bool), typeof(Foobar),
        new UIPropertyMetadata(false, Foobar.TestChanged));

    private static void TestChanged(DependencyObject o, DependencyPropertyChangedEventArgs args)
    {
        var textBox = (TextBox)o;
        var expr = textBox.GetBindingExpression(TextBox.TextProperty); 
        //expr is always null here, but after the window loads it has a value
    }

    [AttachedPropertyBrowsableForType(typeof(TextBoxBase))]
    public static bool GetTest(DependencyObject obj)
    {
        return (bool)obj.GetValue(Foobar.TestProperty);
    }

    [AttachedPropertyBrowsableForType(typeof(TextBoxBase))]
    public static void SetTest(DependencyObject obj, bool value)
    {
        obj.SetValue(Foobar.TestProperty, value);
    }
}

1 个答案:

答案 0 :(得分:0)

尝试收听LayoutUpdated事件。我认为它叫做布局更新事件。否则谷歌吧。这是一个疯狂的小事件,无论你做什么,每次都会被解雇。加载,绘图时,即使你移动鼠标!

看看这个伪代码:

private static void TestChanged(DependencyObject o, DependencyPropertyChangedEventArgs args)
    {
        var textBox = (TextBox)o;
        // start listening
        textBox.LayoutUpdated += SomeMethod();
    }

   private static void SomeMethod(...)
   {
      // this will be called very very often
      var expr = textBox.GetBindingExpression(TextBox.TextProperty); 
      if(expr != null)
      {
        // finally you got the value so stop listening
        textBox.LayoutUpdated -= SomeMethod();