DependencyProperty не запускает ValueChanged, когда новое значение совпадает.

Хорошо, вот в чем проблема: я написал UserControl, который получает новое значение, скажем, каждые 100 мс, и что-то с ним делает. Он должен обрабатывать каждый новый установщик значения, даже если значение не изменилось. UserControl имеет несколько DependencyProperties:

public double CurrentValue
    {
        get { return (double)GetValue(CurrentValueProperty); }
        set { SetValue(CurrentValueProperty, value); }
    }

    public static readonly DependencyProperty CurrentValueProperty =
       DependencyProperty.Register("CurrentValue", typeof(double), typeof(GraphControl), new UIPropertyMetadata(0d));

В XAML, где используется этот элемент управления, я просто установил привязку CurrentValue к свойству (INotifyPropertyChanged-enabled):

<uc:UserControl CurrentValue="{Binding MyValue}" ... />

viewmodel:

    public double MyValue
    {
        get { return _value; }
        set
        {
            //if (_value == value) return;
            _value= value;
            if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("MyValue"));
        }
    }

As вы можете видеть, я явно закомментировал , если равно, то возвращаю , поэтому событие PropertyChanged будет срабатывать, даже когда значение обновляется до того же значения.

Теперь вернемся к моему пользовательскому элементу управления. Я попытался зарегистрировать ValueChanged двумя способами; сначала с помощью DependencyPropertyDescriptor :

var propertyDescriptor = DependencyPropertyDescriptor.FromProperty(CurrentValueProperty, typeof(GraphControl));
propertyDescriptor.AddValueChanged(this, OnCurrentValueChanged);

или с помощью UIPropertyMetaData :

new UIPropertyMetadata(0d, OnCurrentValueChangedCallback)

, чтобы заглушка обратного вызова выглядела так:

private void Callback(object sender, EventArgs e){
    //do stuff
}

Итак, проблема в том, что обратный вызов не запускается, если значение не изменяется явно. Я проверил, и событие PropertyChanged запускается в моей модели просмотра, но элемент управления не видит изменения. Когда значение изменяется на новое значение, он будет обрабатывать обратный вызов, как ожидалось.
Есть ли способ переопределить это поведение, чтобы мой метод обратного вызова всегда попадал в действие?

РЕДАКТИРОВАТЬ:
Я также пробовал использовать CoerceValueCallback , и он срабатывает, когда значение остается прежним, но это не помогает мне с моей проблемой, я думаю ...

15
задан RoelF 26 July 2011 в 07:59
поделиться