據我所知,命令模式的目標是幫助將UI交互與應用程序邏輯分開。有了正確執行命令,在「打印」菜單項,點擊可能會導致這樣的互動鏈條:WPF路由命令是解決問題還是讓問題變得更糟?
(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)
這鼓勵你的UI與應用邏輯分離。
我一直在尋找WPF命令,並在大多數情況下,我看他們是如何實現這種模式。不過,我覺得在某種程度上他們已經將命令模式複雜化並且設法實現它,使得你不鼓勵將UI與應用程序邏輯分開。
例如,假設有一個按鈕將文本粘貼到文本框這個簡單的WPF窗口:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Paste"
Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<StackPanel>
<TextBox x:Name="txtData" />
<Button Command="Paste" Content="Paste" />
</StackPanel>
</Window>
這裏的隱藏代碼:
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
ApplicationCommands.Paste.Execute(null, txtData);
}
}
}
我是怎麼從增益命令?在我看來,我可以輕鬆地將來自命令綁定事件處理程序的代碼放入按鈕的Click
事件中。當然,現在我可以將多個UI元素與Paste命令關聯起來,我只需要使用一個事件處理程序,但是如果我想要粘貼到多個不同的文本框呢?我必須讓事件處理程序的邏輯更加複雜或者編寫更多的事件處理程序。所以現在,我覺得我有這個:
(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|
我在這裏失蹤了什麼?它看起來像一個額外的間接層我。
我昨天晚上看了一本關於命令的書,發現了這些信息,然後很快感覺就像是一種塗料。 – OwenP 2009-01-22 16:17:01