WPF - DependencyProperty 的 PropertyChangedCallback 中的 GetBindingExpression

WPF - GetBindingExpression in PropertyChangedCallback of DependencyProperty

我需要能够从 TextBox 的 DependencyProperty 中访问 TextBox 的文本 属性 的绑定表达式。我的 DependencyProperty 的值设置在 XAML 中。我在我的 DependencyProperty 的 PropertyChangedCallback 方法中调用 GetBindingExpression,但我现在还为时过早,因为 GetBindingExpression 在这里总是 returns null,但在 window 完全加载它肯定 returns 一个值(我测试使用屏幕上的按钮来更改我的 DependencyProperty 的值)。

显然我这里有一个加载顺序问题,我的 DependencyProperty 的值是在文本 属性 绑定到我的视图模型之前设置的。我的问题是,有没有我可以挂钩的事件来确定 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);
    }
}

尝试监听 LayoutUpdated 事件。我认为它称为布局更新事件。否则 google 它。这是一个疯狂的小事件,无论你以前做什么,每次都会被解雇。加载时,绘图时,甚至移动鼠标时!

看看这个伪代码:

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();