Проблема с зависимостью Property и PropertyChangedCallback в WPF - PullRequest
0 голосов
/ 14 ноября 2018

В моем CustomControl у меня есть свойство View View. Внешний элемент управления, который использует этот элемент управления, устанавливает это свойство через модель представления. Когда он установлен, метод Refresh запускается, и представление отображается!

Пока все хорошо! Но что, если я также хочу, чтобы он обновлялся при изменении свойства представления.

Может быть, я не делаю это стандартным способом? Должен ли я определить публичный метод Refresh () для элемента управления и вызвать его извне? Как я могу использовать командование?

  public static readonly DependencyProperty ViewProperty =
     DependencyProperty.Register(
        "View", typeof(View),
        typeof(CustomControl), new PropertyMetadata(Refresh)
     );


  public View View
  {
     get => (View)GetValue(ViewProperty);
     set => SetValue(ViewProperty, value);
  }

  private static void Refresh(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
     // 
     MessageBox.Show("Refreshed!");
  }

   public sealed class View : INotifyPropertyChanged
   {
      private bool m_isDirty;

      public bool IsDirty
      {
         get => m_isDirty;
         set
         {
            m_isDirty = value;
            OnPropertyChanged();
         }
      }

      public event PropertyChangedEventHandler PropertyChanged;

      private void OnPropertyChanged([CallerMemberName] string propertyName = null)
      {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
      }
   }

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете подключить обработчик события для PropertyChanged события View в вашем обратном вызове:

private static void Refresh(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MessageBox.Show("Refreshed!");

    View newView = e.NewValue as View;
    if (newView != null)
        newView.PropertyChanged += NewView_PropertyChanged;

    View oldView = e.OldValue as View;
    if (oldView != null)
        oldView.PropertyChanged -= NewView_PropertyChanged;
}

private static void NewView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    View view = (View)sender;
    //view updated...
}
...