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();
我需要能够从 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();