Сегодня я разговаривал с кем-то о выборе шаблона проектирования для обработки логики в их программе 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, поэтому, возможно, я нарисовал вещи более сложными, чем они есть на самом деле, но я подозреваю, что вы не можете упростить вещи намного больше, чем указано выше.
Изменить:
Я нашел интересное 3-стороннее сравнение между DelegateCommand , RoutedCommand и событие.