Wpf: Использование Присоединенного Свойства И Поведения

Пожалуй, каждый разработчик WPF знает о механизме Attached Property, но о Behavior многие даже не слышали.

Хотя эти механизмы имеют схожий функционал, они все равно имеют совершенно разные значения, и очень важно правильно различать их и использовать.

Давайте вспомним, что это за механизмы: Прикрепленное свойство .

Это свойство зависимостей, которое не объявлено в классе объекта, для которого оно будет использоваться, но ведет себя так, как если бы оно было его частью.

Объявленный в отдельном классе, он имеет методы получения и установки в качестве статических методов.

Вы можете добавить обработчик к событию PropertyChanged.

  
  
  
   

public static class UiConfigurator { public static readonly DependencyProperty CustomValueProperty = DependencyProperty.RegisterAttached( "CustomValue", typeof(bool), typeof(UiConfigurator), new PropertyMetadata(false)); public static void SetCustomValue(DependencyObject element, bool value) { element.SetValue(CustomValueProperty, value); } public static bool GetCustomValue(DependencyObject element) { return (bool)element.GetValue(CustomValueProperty); } }

Оно используется так же, как и обычное свойство зависимостей, вам просто нужно указать класс, в котором оно определено.



<Button testApp:UiConfigurator.CustomValue="True"/>

Благодаря обработчику PropertyChanged очень часто пытаются добавить некоторую функциональность к элементу пользовательского интерфейса с помощью этого механизма.

Например, мы хотим запомнить расположение и размер окна между запусками приложения.

Делаем Attached Property SaveBounds и добавляем обработчик PropertyChanged. Если установлено значение true, мы выполняем код для восстановления/сохранения положения окна.

Это правильно? Нет. Давайте посмотрим, как Microsoft использует этот механизм дома.

Отличными примерами являются Grid.Column и DockPanel.Dock. Все эти свойства никак не влияют на функциональность объекта, а просто добавляют некоторую информацию, чтобы другие члены дерева отображения могли более корректно с ним взаимодействовать.

Сам объект об этом ничего не знает и знать не должен.

Отсюда следует, что само использование события PropertyChanged для Attached Property уже является поводом задуматься: все ли я делаю правильно? Это необходимо только в очень редких случаях.

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

Но это задача «один раз в жизни».

Поскольку Attached Property не влияет на состояние объекта, несколько таких свойств не должны конфликтовать, а значит, мы можем присоединить к нему столько их, сколько захотим.

Например, те же Grid.Column и DockPanel.Dock (хотя это несколько нелогично) можно легко объединить.

Вот ваш второй ключ к тому, правильно ли вы используете этот механизм: если вы можете представить себе код, который может быть написан в целевом объекте или где-либо еще, что будет конфликтовать с вашим свойством, вы сделали что-то не так.

Поведение .

В WPF есть абстрактный класс шаблона под названием Behavior. Сделав преемника, мы можем прикрепить его к объекту в дереве отображения.

Этот класс имеет методы OnAttached и OnDetaching, которые будут вызываться при необходимости.

Ниже приведен пример CloseBehavior, который можно прикрепить к любой кнопке и, таким образом, сделать ее кнопкой закрытия приложения.



public class CloseBehavior : Behavior<Button> { protected override void OnAttached() { AssociatedObject.Click += OnClick; } protected override void OnDetaching() { AssociatedObject.Click -= OnClick; } private void OnClick(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } }

Добавлено следующим кодом:

<Button Content="Закрывать"> <i:Interaction.Behaviors> <testApp:CloseBehavior/> </i:Interaction.Behaviors> </Button>

Здесь поведение, в отличие от прикрепленного свойства, служит для добавления функциональности элементам пользовательского интерфейса.

Вы можете добавить к нему любое свойство зависимостей, и поскольку оно является частью дерева отображения, привязка здесь отлично работает. Поскольку для WPF принято использовать MVVM, а он, в свою очередь, требует минимум кода в теле View, здесь пригодится Behavior. Эти несколько функциональных блоков, которые невозможно выполнить с помощью стандартного связывания, можно вынести и использовать в сочетании друг с другом.

Не все объекты Behavior должны быть совместимы друг с другом.

Например, мы не сможем объединить CloseButtonBehavior и HelpButtonBehavior. И это, конечно, нормально.

Теги: #wpf #прикрепленные свойства #поведение #.

NET #разработка для Windows

Вместе с данным постом часто просматривают: