来自绑定视图模型的“冒泡”事件转到父级

时间:2014-07-18 13:02:57

标签: c# wpf caliburn.micro

首先,我仍然习惯了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>

2 个答案:

答案 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的继承问题。