Направленные события и свойства зависимостей .NET-оболочка путаница - PullRequest
1 голос
/ 24 сентября 2011

Я новичок в WPF, и у меня возникла путаница в отношении синтаксиса перенаправления событий и свойств зависимостей. Я видел во многих источниках, что перенаправленные события и свойства зависимостей обернуты так:

// Routed Event
public event RoutedEventHandler Click
{
 add
 {
  base.AddHandler(ButtonBase.ClickEvent, value);
 }
 remove
 {
  base.RemoveHandler(ButtonBase.ClickEvent, value);
 }
}

// Dependency Property
public Thickness Margin
{
 set { SetValue(MarginProperty, value); }
 get { return (Thickness)GetValue(MarginProperty); }
}

Я никогда не видел, чтобы добавить / удалить / установить / получить сортировку ключевых слов в C #. Являются ли они частью языка C # как Ключевые слова, и я никогда не испытывал и не работал с ними, потому что я не работал в C # как профессионал, я программист C ++? Если не ключевые слова, то как они обрабатываются компилятором, если они не являются частью C #, и как они работают

1 Ответ

2 голосов
/ 24 сентября 2011

Я попытаюсь подвести итог для вас:

Свойство зависимости:

public int MyProperty
{
    get { return (int)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}

// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register("MyProperty", typeof(int), typeof(MyClass), new UIPropertyMetadata(MyDefaultValue));

Это полный синтаксис, вам не нужно его запоминать, просто используйтеФрагмент «propdp» в Visual Studio.
«get» должен возвращать значение того типа, на который он ссылается (в моем примере это int).Всякий раз, когда вы вызываете

int MyVar = MyProperty;

Оценивается код внутри "get".
В наборе есть похожий механизм, только у вас есть другое ключевое слово: "value", которое будет значением, которое вы назначите MyVariable:

MyProperty = 1;

Будет вызывать "set" из MyProperty, а "value" будет "1".

Теперь для RoutedEvents:

В C # (как в C ++поправьте меня, если я ошибаюсь), чтобы подписаться на событие, вы делаете

MyProperty.MyEvent += MyEventHandler;

Это вызовет «добавить» -> вы добавляете обработчик в стек.Теперь, поскольку он не собирается автоматически, и мы хотим избежать утечек памяти, мы делаем:

MyProperty.MyEvent -= MyEventHandler;

Чтобы наш объект можно было безопасно утилизировать, когда он нам больше не нужен.Вот когда вычисляется выражение «удалить».

Этот механизм позволяет вам делать несколько вещей в одном «get», широко используемым примером в WPF будет:

private int m_MyProperty;
public int MyProperty
{
   get
   {
      return m_MyProperty;
   }
   set
   {
      if(m_MyProperty != value)
      {
         m_MyProperty = value;
         RaisePropertyChanged("MyProperty");
       }
    }
}

, которыйво ViewModel, который реализует INotifyPropertyChanged, уведомит привязки в вашем View, что свойство изменилось и его необходимо получить снова (поэтому они будут вызывать «get»)

...