PRISM中使用CompositeCommand一点心得体会

82 篇文章 12 订阅
53 篇文章 5 订阅

 

在学习CompositeCommand的过程中,遇到单个命令可以执行,CompositeCommand无法执行的问题

 

关键代码如下:

1、声明CompositeCommand

 

           public  CompositeCommand MyCompositeCommand = new CompositeCommand();

 

2、声明两个DelegateCommand

 

         public DelegateCommand<object> Command1 { get; private set; }
         public DelegateCommand<object> Command2 { get; private set; }

 

3、实例化两个DelegateCommand命令

 

            Command1 = new DelegateCommand<object>(OnClick1, args => true);
            Command2 = new DelegateCommand<object>(OnClick2, args => true);

4、把两个DelegateCommand命令注册到MyCompositeCommand

            MyCompositeCommand.RegisterCommand(Command1);
            MyCompositeCommand.RegisterCommand(Command2);

5、在页面中添加按钮绑定命令

            <Button Content="执行多条命令" Command="{Binding MyCompositeCommand}"/>

执行程序后,点击按钮  Command1 Command2都没有被执行。

很长时间没有找到原因,在百度上看到如下说明及代码

---------------------------------------------------------------------------------------------------------------------------------

 

9.1.2 创建一个复合命令

要创建一个复合命令,在构造器中实例化一个CompositeCommand的对象,向里面添加命令,最后以ICommand属性的形式将它暴露出去。

 

public class MyViewModel : NotificationObject
{
    private readonly CompositeCommand saveAllCommand;

    public ArticleViewModel(INewsFeedService newsFeedService,
                            IRegionManager regionManager,
                            IEventAggregator eventAggregator)
    {
        this.saveAllCommand = new CompositeCommand();
        this.saveAllCommand.RegisterCommand(new SaveProductsCommand());
        this.saveAllCommand.RegisterCommand(new SaveOrdersCommand());
    }

    public ICommand SaveAllCommand
    {
        get { return this.saveAllCommand; }
    }
}

--------------------------------------------------------------------------------------------------------------------------------

关键“最后以ICommand属性的形式将它暴露出去。”给了启发。

 

然后把代码进行修改如下:

 

1、声明CompositeCommand 

 

private readonly CompositeCommand _MyCompositeCommand = new CompositeCommand();

 

4、把两个DelegateCommand命令注册到MyCompositeCommand

            _MyCompositeCommand.RegisterCommand(Command1);
            _MyCompositeCommand.RegisterCommand(Command2);

 

6、添加以下方法 以实现最后以ICommand属性的形式将它暴露出去。

       public ICommand MyCompositeCommand
        {
            get { return this._MyCompositeCommand; }
        }

再运行程序,执行成功。

 

 

 

 

------------------------------------------------------------------------------------------------------------

以下为网上搜到的内容:

 

 

9.1.1创建代理命令

要创建代理命令,那么在View Model的构造函数中实例化一个DelegateCommand的对象(field,在类里是数据域的意思,但是放在这里不好听,所以instantiate a xxx field我翻译为实例化XXX对象,下文同),以ICommand属性的形式将它暴露出去。

 

public class ArticleViewModel : NotificationObject
{
    private readonly ICommand showArticleListCommand;

    public ArticleViewModel(INewsFeedService newsFeedService,
                            IRegionManager regionManager,
                            IEventAggregator eventAggregator)
    {
        this.showArticleListCommand = new DelegateCommand(this.ShowArticleList);
    }

    public ICommand ShowArticleListCommand 
    {
        get { return this.showArticleListCommand; } 
    }
}

 


9.1.2 创建一个复合命令

要创建一个复合命令,在构造器中实例化一个CompositeCommand的对象,向里面添加命令,最后以ICommand属性的形式将它暴露出去。

 

public class MyViewModel : NotificationObject
{
    private readonly CompositeCommand saveAllCommand;

    public ArticleViewModel(INewsFeedService newsFeedService,
                            IRegionManager regionManager,
                            IEventAggregator eventAggregator)
    {
        this.saveAllCommand = new CompositeCommand();
        this.saveAllCommand.RegisterCommand(new SaveProductsCommand());
        this.saveAllCommand.RegisterCommand(new SaveOrdersCommand());
    }

    public ICommand SaveAllCommand
    {
        get { return this.saveAllCommand; }
    }
}

 


9.1.3 使命令全局有效

通常,创建一个全局有效的命令就是实例化DelegateCommand或者CompositeCommand的对象,并且将其通过静态类的形式暴露。

public static class GlobalCommands
{
    public static CompositeCommand MyCompositeCommand = new CompositeCommand();
}


在模块中,将子命令与其关联。

GlobalCommands.MyCompositeCommand.RegisterCommand(command1);
GlobalCommands.MyCompositeCommand.RegisterCommand(command2);


【注意】:为了增加代码的可测试性,创建一个用以访问全局命令(Global Available Command 下文同)的代理类并且在测试中模拟该代理类。

9.1.4 绑定全局命令

下文说明了如何将命令绑定到WPF的按钮上。

<Button Name="MyCompositeCommandButton" Command="{x:Static local:GlobalCommands.MyCompositeCommand}">Execute My Composite Command </Button>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值