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