首先,我仍然习惯了Caliburn和WPF,所以我可能会以错误的方式做这件事。我很想知道更好的方式!
我有一个Conductor
shell视图模型,它有一个包含一些共享元素的视图,以及一个ActiveItem
的内容控件。现在,我希望ActiveItem
视图模型中的一组按钮显示在内容控件之外,但仍然将其单击事件转到活动视图模型。我尝试过这样添加ItemsControl
:
<ItemsControl x:Name="ActiveItem_Buttons">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" HorizontalAlignment="Right"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}" Margin="10" Height="25" Width="80">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="{Binding Name}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
(我正在执行Interaction.Trigger
部分,因为我无法绑定到x:Name
,这会导致Caliburn自动连接它
但是,我得到一个例外,说明Caliburn找不到匹配的方法。看起来它开始从shell视图模型冒泡,而不是活动项视图模型。如何设置&#34;起点&#34;冒泡的事件?我发现并尝试了附加属性cal:View.Model="{Binding ActiveItem}"
,但这似乎没有帮助。
编辑:为清楚起见:Buttons
属性是在视图模型基类ButtonScreenBase
上定义的,而shell继承了Conductor<ButtonScreenBase>
答案 0 :(得分:0)
而不是在WPF中使用事件和事件处理,尤其是与MVVM结合使用。请改用Command
模式。对于用户操作,这意味着您可以通过手势,点击和View中的其他类型的用户交互事件触发命令,并在View中从ViewModel触发的Command
类/方法中包含业务逻辑,从而维护用户界面逻辑和业务逻辑的分离。
我建议使用此链接来了解命令以及如何实现它们(以及基本原则的MVVM):http://kentb.blogspot.co.uk/2009/04/mvvm-infrastructure-delegatecommand.html
答案 1 :(得分:0)
更新:回去检查一些关于这个特定问题的其他帖子,这个问题是关于这个问题的解释。
Bind a Command to a Button inside a ListView with Caliburn.Micro
<Button Content="{Binding Name}" cal:Bind="{Binding}" Margin="10" Height="25" Width="80">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="{Binding Name}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
同样的事情是datatemplating的继承问题。