2015-04-13 2 views
0

Мне нужно иметь доступ к выражению привязки для свойства Text для TextBox из DependencyProperty в TextBox. значение моего DependencyProperty установлено в XAML. Я вызываю GetBindingExpression в методе DependencyProperty PropertyChangedCallback, но я слишком рано на этом этапе, потому что GetBindingExpression всегда возвращает null здесь, но после того, как окно полностью загрузится, оно определенно возвращает значение (я тестировал с помощью кнопки на экране, чтобы изменить значение моего DependencyProperty).WPF - GetBindingExpression в PropertyChangedCallback DependencyProperty

У меня проблема с загрузкой здесь, где значение моей DependencyProperty установлено до того, как свойство Text привязано к моей модели представления. Мой вопрос: есть ли какое-то событие, которое я могу связать, чтобы определить, когда привязка свойства Text завершена? Предпочтительно без изменения XAML моего TextBox, поскольку у меня есть сотни из них в решении.

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

Где вы настройки привязки? – lerner1225

ответ

0

Попробуйте послушать LayoutОбнованное событие. Я думаю, что это называется обновленным событием макета. Else 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(); 
+0

Да, это прекрасно работает, спасибо! Это событие называется сумасшедшим, как вы говорите, поэтому я обязательно заставлю слушателя, как только я сделаю то, что мне нужно сделать. – wwarby

+0

Его просто фиктивное событие, чтобы уведомить вас о чем-то в пользовательском интерфейсе, изменилось. Его очень важно убрать слушателя. –

Смежные вопросы