2010-04-28 2 views
5

У меня есть свойство зависимостей ИНТ на моей пользовательской Textbox, который содержит значение подложки. Он связан с int? свойство в DataContext.WPF свойства зависимостей сеттер не стрелять, когда PropertyChanged обжигают, но значение источника не изменяется

Если я поднимаю событие PropertyChanged в своем DataContext, а значение свойства источника не изменяется (остается неопределенным), тогда установщик свойства зависимостей не запускается.

Это проблема, потому что я хочу обновить пользовательский текстовый блок (очистить текст) в PropertyChanged, даже если свойство source остается неизменным. Тем не менее, я не нашел опции привязки, которая делает то, что я хочу (есть свойство UpdateSourceTrigger, но я хочу обновить цель здесь, а не источник). Возможно, есть лучший способ сообщить текстовому блоку, что он должен очистить свой текст, я открыт для любых предложений.

Источник, в соответствии с просьбой (упрощенный)

DataContext (источник):

private int? _foo; 

    public int? Foo 
    { 
     get 
     { 
      // The binding is working, because _foo is retrieved (hits a breakpoint here). 
      // RaisePropertyChanged("Foo") is called from elsewhere, even if _foo's value is not changed 
      return _foo; 
     } 
     set 
     { 
      // Breakpoint is hit on user input, so the binding is working 
      _foo = value; 
      RaisePropertyChanged("Foo"); 
     } 
    } 

Пользовательские Textbox (цель):

public double? Value 
{ 
    get 
    { 
     return (double?)GetValue(ValueProperty); 
    } 
    set 
    { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
      SetValue(ValueProperty, value); 

      // This is the piece of code that needs to be run whenever Value is set to null 
      if (value == null && !String.IsNullOrEmpty(Text)) 
      { 
       Text = String.Empty; 
      } 
     } 
    } 

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double?), typeof(CustomTextbox), new PropertyMetadata(null, ValueChangedHandler)); 

    private static void ValueChangedHandler(DependencyObject dependecyObject, DependencyPropertyChangedEventArgs e) 
     { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
     } 
+1

Можете ли вы разместить код? Это облегчит понимание вашей проблемы. Как именно вы поднимаете событие PropertyChanged в своем DataContext? – wpfwannabe

+0

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

+0

Я разместил код. Приложение слишком сложное, чтобы включить сюда весь источник. Имена были заменены. –

ответ

16

Часть XAML будет вызывать SetValue непосредственно, вместо вызова ваш собеседник. Я точно не помню специфику, но я столкнулся с подобной проблемой некоторое время назад. Вы не должны вводить какую-либо логику в setter для Value, а вместо этого определять обратный вызов, когда изменяется свойство Dependency, и обновлять значение оттуда.

+0

Отлично! Я искал, почему моя логика в комплекте не была выполнена. –

+0

+1 - Спасибо, Валери, ты спас мой день! –

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