Пожалуй, каждый разработчик 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
-
Бреттон-Вудсская Система
19 Oct, 24 -
Эпическая История Гонки На 1:59:59.
19 Oct, 24 -
Безопасность И Уничтожение Данных В Google
19 Oct, 24 -
Провайдеры, Не «Спите»!
19 Oct, 24 -
Превратите Свой Ipod Touch В Iphone
19 Oct, 24 -
Стартапы: Мастер-Класс №3
19 Oct, 24