2012-04-13 2 views
3

Я создал элемент управления, полученный от Canvas, который должен отображать живую диаграмму, заданные значения, которые передаются через привязку к DependencyProperty. Упрощенная версия такова:DependencyProperties: PropertyChangedCallBack только вызывается один раз

public class Plotter : Canvas 
{ 
    public float Value { get { return (float)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(float), typeof(Plotter), 
     new PropertyMetadata(0f, new PropertyChangedCallback(ValueChangedCallBack))); 

    public static void ValueChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args) 
    { 
     Plotter plotter = (Plotter)property; 
     plotter.Value = (float)args.NewValue; //<-- Removed this line to get it to work 

     // Actually draw the value into the canvas geometry 
     plotter.PlotValue(plotter.Value); 
    } 
} 

Я связала контроль, как это:

<mystuff:Plotter Value="{Binding MyViewModelProperty}" Height="50" Width="200" /> 

Мои ViewModel реализует INotifyPropertyChanged и называет PropertyChanged правильно. Если я привяжу MyViewModelProperty к текстовому поле, он будет правильно обновляться каждый раз. Только если я привяжу его к своему собственному элементу управления, мой ValueChangedCallBack вызывается только один раз, когда страница загружается, а затем больше никогда.

Что я не вижу здесь? Спасибо за любую помощь!

Решено: Я не должен устанавливать Value явно в обратном вызове.

ответ

5

Устанавливается свойство Значение для обратного вызова для свойства Изменение стоимости. В любом случае это не имеет большого смысла. Но является ли это локально установленным значением, переопределяющим значение привязки, в результате чего привязка больше не будет установлена ​​в свойстве зависимостей?

+0

Ахх, это была проблема. Большое спасибо! Я просто удалил строку, которая задает '' Value'' явно, и теперь она работает! –

1

Вам нужно установить режим привязки к TwoWay?

+0

Нет, это должно быть просто привязка OneWay. ViewModel выдает новое значение, и мой элемент управления должен быть уведомлен и занести его в геометрию холста. –

1

Если вы не используете DependencyProperty.Register вместо DependencyProperty.RegisterAttached?

+0

О, извините, просто скопируйте и вставьте ошибку. Первоначально это было '' DependencyProperty.Register''. Я изменил его, чтобы быть уверенным. Он не работает с обеими версиями. –

+0

Ответ Николаса W, похоже, на правильном пути. Удалить plotter.Value = (float) args.NewValue; из метода обратного вызова, и все должно быть хорошо. – calum

+0

Да, это была проблема. Благодаря! –

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