SilverlightCaliburn应用框架5

         Silverlight-Caliburn应用框架1

         Silverlight-Caliburn应用框架2

         Silverlight-Caliburn应用框架3

         Silverlight-Caliburn应用框架4 

         Silverlight-Caliburn应用框架5

         Silverlight-Caliburn应用框架6

     这篇主要了解一下Caliburn中的Command特性。

     在前面已经提到Caliburn的Command提供了基本的命令模式的实现,Sl3之前版本不支持Command属性,通过Caliburn框架可以很简单的解决这个问题

Command是在前面所讲的Action基础上实现的,所以它继承了Action的所有特点,即我们所提到的包括输入参数,过滤器,异步执行等等。

    下面我们仍然在前面例子的基础上进行修改,看看Silverlight中是如何使用Cailburn中的Command特性的。

                                  捕获

    首先我们将之前的Action代码修改一下,ExtractCommand.cs中代码:

         public class ShowExtractCommand
    {
        public double Execute(double param)
        {
            return Math.Sqrt(param);
        }
        public bool CanExecute(double param)
        {
            return param >= 0;
        }
    }

     你已经看到了,这个就是我们接下来使用的Command,Cailburn框架中声明的Command须具有一个Execute方法,当然这并不是绝对的,

你也可以Command特性修饰一个类,并指明访问一个方法。关于过滤器的部分则和Action一样,若是遵循CanExecute的命名方式,

则会自动的应用在相应的方法上,你若是不熟悉,可以回过头看看Action部分的说明。

    现在我们修改UI,这里我们首先引入相关命名空间

        <xmlns:local="clr-namespace:Commands"
        xmlns:ca="clr-namespace:Caliburn.PresentationFramework.Commands;assembly=Caliburn.PresentationFramework" 
        xmlns:pf="clr-namespace:Caliburn.PresentationFramework;assembly=Caliburn.PresentationFramework" 
        xmlns:ct="clr-namespace:Caliburn.PresentationFramework.Triggers;assembly=Caliburn.PresentationFramework" 
        xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"/>

     注意这里的ca所引用的命名空间是Caliburn框架中的Commands ,接下来,我们的UI只是在原来的基础上将Action的使用改变为Command的使用

        <TextBox Name="txtInput"  />
        <TextBox Name="txtResult" />
        <Button Content="计算"  Name="button1">
            <pf:Message.Triggers>
                <pf:RoutedMessageTriggerCollection>
                    <ct:EventMessageTrigger EventName="Click">
                        <ct:EventMessageTrigger.Message>
                            <ca:CommandMessage  Command="ShowExtractCommand" OutcomePath="txtResult.Text">
                                <pf:Parameter ElementName="txtInput" Path="Text"></pf:Parameter>
                            </ca:CommandMessage>
                        </ct:EventMessageTrigger.Message>
                    </ct:EventMessageTrigger>
                </pf:RoutedMessageTriggerCollection>
            </pf:Message.Triggers>
         </Button>

     如果你注意和前面Action的比较,你会发现两者只有一些小小的改动,我们只是将ActionMessage替换成了CommandMessage,

例子中Command被设置为ShowExtractCommand的一个实例。

    那么最后一步,我们配置这个Command:

         private void Application_Startup(object sender, StartupEventArgs e)
        {
            var container = new SimpleContainer();
            CaliburnFramework.ConfigureCore(container).WithPresentationFramework().Start();
            container.RegisterSingleton<ShowExtractCommand>("ShowExtractCommand");
            this.RootVisual = new MainPage();
        }

    这里配置写在Application_Startup事件中,如果你忘了配置这个Command,运行时会报出AG_E_PARSER_BAD_PROPERTY_VALUE 这样的错误。

因为这里使用了默认的SimpleContainer容器,最后可以通过类型的名称向容器外暴露这个类型,所以我们在上面的XAML代码中可以通过将Command属

性值设为ShowExtractCommand获取对应的实例。

     到这个时候,我们已经完整的展现了一个最简单的使用Command特性的例子,那么问题是Command有没有和Action类似的简写方式呢,答案是有的。

我们将上面的Button的XAML代码修改一下:

         <Button  Name="button2" pf:Message.Attach="ContainerCommand ShowExtractCommand(txtInput.Text):txtResult.Text"/>

     前面我们提到Command属性值是一个命令类的实例,那么通常情况下,这个类可以在依赖注入容器中,也可以在数据绑定和资源中,那么采用上面的方式

是因为我们通过在依赖注入容器中获取到这个实例的,所以在Attach属性中指明了ContainerCommand,那么我们也可以在资源中获取这个实例

     首先在UI中声明这个资源

        <UserControl.Resources>
        <local:ShowExtractCommand x:Key="showExtract"></local:ShowExtractCommand>
        </UserControl.Resources>

    接着我们修改Button获取这个资源的实例:

        <Button  pf:Message.Attach="ResourceCommand showExtract(txtInput.Text):txtResult.Text"/>
  Command属性值可以被设置为一个字符串并通过key在容器中获取对应的实例,这里我们即在页面中声明了Key为showExtract的资源,在这种方式下,
我们就不需要再在App.xaml.cs中对Command命令进行注册。
   好了,这篇就对Caliburn中的Command特性做了一个简单但较为整体的介绍,下篇再来探讨一下Caliburn中命令的其它使用。

  代码下载:BasicCommandInCaliburn    VS2010 +SL3

原文地址:https://www.cnblogs.com/626498301/p/1814437.html