Почему не работает INotifyPropertyChanged? - PullRequest
1 голос
/ 14 февраля 2011

Я использовал Multibinding для привязки некоторых свойств и использования интерфейса INotifyPropertyChanged для уведомления об изменениях этих свойств. Но, к сожалению, кажется, что INotifyPropertyChanged не работал.PropertyChangedEventHandler "PropertyChanged" всегда был нулевым.

Вопросы:

A.Не могли бы вы сказать мне, почему событие является нулевым? На мой взгляд, должен быть метод по умолчанию для события PropertyChangedEventHandler, я не прав? (Решено, спасибо!)

B.Как и говорили некоторые друзья, я попытался снова, не используя INotifyPropertyChanged. Но значение свойства цели, похоже, не изменилось ...


  1. Свойства

    public static readonly DependencyProperty LeftOffsetProperty = DependencyProperty.Register("LeftOffset", typeof(double), typeof(NetworkTaskLable), new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsRender));
    public static readonly DependencyProperty TopOffsetProperty = DependencyProperty.Register("TopOffset", typeof(double), typeof(NetworkTaskLable), new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsRender));
    
    public double LeftOffset
    {
        get { return (double)GetValue(LeftOffsetProperty); }
        set { SetValue(LeftOffsetProperty, value); }
    }
    public double TopOffset
    {
        get { return (double)GetValue(TopOffsetProperty); }
        set { SetValue(TopOffsetProperty, value); }
    }
    
  2. Multibinding (кажется, работает хорошо. Используя конвертер для расчета местоположения, на которое влияют "TopOffset" и "LeftOffset")

    var multibinding = new MultiBinding() { Converter = new BeginAndStartDateToLeftConverter_NetworkTaskLable(), ConverterParameter = NetworkView };
    multibinding.Bindings.Add(new Binding("Start"));
    multibinding.Bindings.Add(new Binding("StartDate") { Source = NetworkView });
    multibinding.Bindings.Add(new Binding("LeftOffset") { Source = this });
    MainCanvas.SetBinding(LeftProperty, multibinding);
    
  3. INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    public void CallPropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)//It seems to be null all the time!!!And the properties'changes were never notified!!!
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }
    
  4. Уведомить об изменении

    SetValue(LeftOffsetProperty, moveAdorner.LeftOffset);
    CallPropertyChanged("LeftOffset");
    SetValue(TopOffsetProperty, moveAdorner.TopOffset);
    CallPropertyChanged("TopOffset");
    

Ответы [ 3 ]

4 голосов
/ 14 февраля 2011

Вам не нужно реализовывать INotifyPropertyChanged для свойств зависимостей. Привязка будет отслеживать изменения этих свойств автоматически.

1 голос
/ 14 февраля 2011

Set Mode=TwoWay где-нибудь в вашей привязке?

0 голосов
/ 14 февраля 2011

Вам необходимо переопределить OnPropertyChanged и проверить, является ли свойство тем, которое вы ищете.

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
    if (e.Property == MyProperty)
    {
        // do something
    } 
    base.OnPropertyChanged(e);   
}
...