从不在DataContext中的控件调用方法

时间:2014-06-07 12:01:09

标签: c# wpf caliburn.micro

我在UserControl中有一个按钮,我想在另一个类中调用一个方法(这恰好是我的主窗口的视图模型)。

<ToggleButton cal:Message.Attach="[Event Click] = [Action ToggleWatch]">

用户控件的DataContext与DataTemplate绑定。这使得一切都很美,除非我遇到这样的情况,在DataTemplate类中实现ToggleWatch方法并没有多大意义,因为DataTemplate应该只包含数据。

解决此问题的最佳方法是将此控件的DataContext设置为MainWindowViewModel吗?当我想将DataTemplate中的值绑定到同一个按钮时,该解决方法失败,因为DataContext修改将使它在MainWindowViewModel中查找值。

如果我对这个问题感到困惑,我会总结一下。我有一个UserControl,其DataContext是一个单独的DataTemplate。我想在单击按钮时从按钮调用方法,但我希望从DataTemplate中分离该方法。我希望这个方法完全不同。解决这个问题的最佳方法是什么?

以下是我设置DataTemplate的方法:

<WrapPanel>
    <ItemsControl ItemsSource="{Binding Devices}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <local:DeviceCleanerBox/>
                ...

1 个答案:

答案 0 :(得分:0)

UserControl必须作为MainWindow的子项存在,如果我是对的,您必须将MainWindow的DataContext设置为MainWindowViewModel。

所以,你可以做的是在MainWindowViewModel中声明ICommand并使用RelativeSource 绑定到按钮的Command来搜索窗口的DataContext:

<ToggleButton Command="{Binding DataContext.CommandName,
                               RelativeSource={RelativeSource Mode=FindAncestor, 
                                                        AncestorType=Window}}"/>