Я говорил с кем-то сегодня о выборе шаблона проектирования для обработки логики в их программе WPF и надеялся, что сообщество SO может помочь с дальнейшими советами, чтобы облегчить принятие решения. Какие факторы в пользу команд перевешивают неудобства?
Я подготовил полный образец вместе с некоторыми UML-диаграммами первых двух из трех подходов:
- Использовать обработчики событий Click для кнопок и меню.
- Использовать команды, связанные в XAML.
- Используйте команды, связанные в коде, с сохранением XAML для чистого макета и стиля графического интерфейса.
Вступительный курс, на котором он был, и многие книги показывают простые обработчики событий Click как естественный способ подключения логики к объектам пользовательского интерфейса.
Он был немного ошеломлен количеством накладных расходов, необходимых для использования команд с обеими командами, создаваемыми в коде файла:
public static readonly ICommand cmdShow2 = new RoutedUICommand(
"Show Window2", "cmdShow2",
typeof(TestDespatchWindow));
и еще больше кода в XAML с многословным способом, которым команда должна быть идентифицирована и ограничена:
<Window x:Class="WPFDispatchDemo.TestDespatchWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:w="clr-namespace:WPFDispatchDemo"..>
<Window.CommandBindings>
<CommandBinding Command="{x:Static w:TestDespatchWindow.cmdShow2}"
Executed="OnShow2" />
</Window.CommandBindings>
<DockPanel>
<StackPanel Margin="0,8,0,0">
<Button x:Name="Show2EventBased"
Margin="10,2,10,2"
Click="OnShow2"
Content="Show2 via WPF Event"/>
<Button x:Name="Show2Command"
Command="{x:Static w:TestDespatchWindow.cmdShow2}"
Margin="10,2,10,2"
Content="Show2 via WPF"/>
</StackPanel>
</DockPanel>
</Window>
Я не могу (пока) претендовать на звание эксперта WPF, поэтому я мог бы нарисовать вещи более сложными, чем они есть на самом деле, но я подозреваю, что вы не можете упростить вещи намного больше, чем выше.
Edit:
Я нашел интересное трехстороннее сравнение между DelegateCommand, RoutedCommand и Event.