Установщик свойства зависимости WPF не срабатывает при запуске PropertyChanged, но исходное значение не изменяется

У меня есть свойство зависимости int в моем настраиваемом текстовом поле, которое содержит значение поддержки. Он привязан к int? свойство в DataContext.

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

Это проблема, потому что я хочу обновить настраиваемое текстовое поле (очистить текст) в PropertyChanged, даже если исходное свойство остается прежним. Однако я не нашел ни одного варианта привязки, который делает то, что я хочу (есть свойство 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");
      }
  }

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

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
        }

person Sandor Davidhazi    schedule 28.04.2010    source источник
comment
Вы можете разместить код? Это значительно упростило бы понимание вашей проблемы. Как именно вы вызываете событие PropertyChanged в своем DataContext?   -  person wpfwannabe    schedule 28.04.2010
comment
Он должен обновляться, даже если источник тот же. Разместите свой код, решение должно быть легко обнаружено.   -  person Aurelien Ribon    schedule 28.04.2010
comment
Я разместил код. Приложение слишком сложное, чтобы включать сюда весь исходный код. Имена были заменены.   -  person Sandor Davidhazi    schedule 28.04.2010


Ответы (1)


XAML будет вызывать SetValue напрямую, а не вызывать средство задания свойств. Точно не помню, но недавно столкнулся с похожей проблемой. Вы не должны помещать какую-либо логику в установщик для значения, вместо этого определите обратный вызов, когда свойство зависимости изменяется, и обновите значение оттуда.

person Valerie    schedule 28.09.2010
comment
Здорово! Я искал, почему моя логика на съемочной площадке не выполнялась. - person Ignacio Soler Garcia; 12.10.2011