要将处理程序挂接到 CanExecute 和 Execute 方法,StringDelegateCommand 类公开图 7 中所示的事件访问器,从而允许处理程序从基础委托轻松订阅或取消订阅。注意,您还可以在处理程序订阅或取消订阅时使用事件访问器触发 CanExecuteChanged 事件。
public event Action<string> ExecuteTargets { add { m_ExecuteTargets += value; } remove { m_ExecuteTargets -= value; }}public event Func<bool> CanExecuteTargets { add { m_CanExecuteTargets += value; CanExecuteChanged(this, EventArgs.Empty); } remove { m_CanExecuteTargets -= value; CanExecuteChanged(this, EventArgs.Empty); }}
路由处理程序示例
在 代码下载的示例应用程序中,我挂接了这个类。该示例有一个简单视图,隐含一个表示器(沿用 MVP,但没有模型)。表示器向视图公开一个表示模型以绑定数据(您可将表示模型想象成位于表示器和视图之间,而 MVP 模型位于表示器之后)。表示模型通常公开视图可以绑定数据的属性。在本例中,它仅公开了一个命令属性,以便可以通过数据绑定在视图的 XAML 中轻松实现挂接。
<Window x:Class="CustomCommandsDemo.SimpleView" ...> <Grid> <Button Command="{Binding CookDinnerCommand}" CommandParameter="Dinner is served!" ...>Cook Dinner</Button> <Button Click="OnAddHandler" ...>Add Cook Dinner Handler</Button> </Grid></Window> Binding 声明只查找当前 DataContext 的属性(名为 CookDinnerCommand),如找到,则将它传给 Icommand。我们在前面提到过 CommandParameter,调用程序可以用它随同命令传递某些数据。在本例中,请注意我只传递了将通过 StringDelegateCommand 传递给处理程序的字符串。
此处所示为视图的代码隐藏(Window类):
public partial class SimpleView : Window { SimpleViewPresenter m_Presenter = new SimpleViewPresenter(); public SimpleView() { InitializeComponent(); DataContext = m_Presenter.Model; } private void OnAddHandler(object sender, RoutedEventArgs e) { m_Presenter.AddCommandHandler(); }}视图构建其表示器,从表示器取得表示模型,然后将其设置为 DataContext。它还有按钮 Click 的处理程序,该处理程序调入表示器,让它为命令添加处理程序。
图 8 显示了运行中的这一应用程序。第一个窗口处于初始状态,未挂接命令处理程序。由于没有命令处理程序,所以您会看到第一个按钮(调用程序)被禁用。按第二个 按钮时,它会调入表示器并挂接新的命令处理程序。此时会启用第一个按钮,您再单击它时,它会调用其通过数据绑定松散联接的命令处理程序和基础命令的订户列 表。