天下网吧 >> 网吧方案 >> 网络方案 >> 正文

了解WPF中的路由事件和命令

用 Func<bool> 委托挂接确定是否启用命令的处理程序。在 CanExecute 实现中,类遍历挂接到 m_CanExecuteTargets 委托的处理程序,查看是否有处理程序想执行的委托。如果有,它为要启用的 StringDelegateCommand 返回 true。调用 Execute 方法时,它仅需检查是否启用了命令,如启用,则调用所有挂接到 m_ExecuteTargets Action<string> 委托的处理程序。

    要将处理程序挂接到 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 显示了运行中的这一应用程序。第一个窗口处于初始状态,未挂接命令处理程序。由于没有命令处理程序,所以您会看到第一个按钮(调用程序)被禁用。按第二个 按钮时,它会调入表示器并挂接新的命令处理程序。此时会启用第一个按钮,您再单击它时,它会调用其通过数据绑定松散联接的命令处理程序和基础命令的订户列 表。

本文来源:天下网吧 作者:网吧方案

相关文章
没有相关文章
声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系Email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下