您的位置:首页 > 其它

Silverlight-Caliburn应用框架5

2010-09-01 09:08 225 查看
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
{
[/code]
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"
[/code]
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" />
[/code]
<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)
{[/code]
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>
[/code]
</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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: