我有一个公开几个命令属性的行为。通常我使用MVVM Light,并且只在我的视图模型中使用路由命令并绑定到那些。但是,这个项目正在使用Caliburn.Micro所以我正在尝试使用Caliburn.Micro方式。我可以在Message.Attach上使用一些语法来执行此操作(是否有关于Message.Attach的解析器的任何好文档)?
我是否必须修改行为以公开事件以使其与Caliburn.Micro一起使用?
答案 0 :(得分:4)
Caliburn.Micro有自己的视图/视图模型通信机制,可以替代命令Actions。您应该能够将Action参数设置为现有命令的Execute
委托,并且如果需要,设置适当的视图控件属性(例如IsEnabled
)以绑定到CanExecute
委托
答案 1 :(得分:3)
Caliburn.Micro为您处理路由操作,只要您正确设置View和ViewModel(它使用一些隐含的假设,这可能是也可能不是您的一杯茶)这是一个关于操作的链接:{{3 }}
做同样事情的更好,更不紧密耦合的方式是使用Event Aggrigator - http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions&referringTitle=Documentation
查看Caliburn.Micro源代码中可用的HelloEventAggrgator代码示例,以获取示例......但基本的jist是这样的:
您可以制作自定义事件以供聚合器使用。
public YourEvent
{
...
}
您的视图将发布这些自定义事件 - 它不关心谁在监听,只关注事件是否已发布。
public YourCodeBehind
{
public Button_Clicked(...)
{
this.Events.Publish(new YourEvent());
...
}
....
}
您的ViewModel将设置为通过添加IHandle
来处理这些事件[Export(typeof(...))]
public class YourViewModel : IShell, IHandle<YourEvent>
{
[ImportingConstructor]
public YourViewModel(IEventAggregator events)
{
events.Subscribe(this);
...
}
public Handle(YourEvent event)
{
...
}
...
{
这种方法通过允许View真正只处理对数据的绑定和发布事件来保持非常高的SoC - 视图仍然不关心如何处理事件。
然后设置每个视图模型以通过添加IHandle接口来处理事件。 (请注意,您可以在单个ViewModel上拥有许多不同的IHandle接口)ViewModel不关心事件的引发方式,只关注它,并且它是从聚合器处理该事件的权限。
答案 2 :(得分:-1)
我最终将行为重写为触发器而不是处理此问题。