WPF MVVM:来自内部附加usercontrol的控件的调用方法

时间:2015-03-04 10:04:02

标签: c# wpf mvvm user-controls caliburn.micro

我有自定义控件(FooCtrl),它有4个DependencyProperties(Q1,Q2,Q3和Q4)。

public partical class FooCtrl : UserControl { 
    // ... 

    // Q1:
    public static readonly DependencyProperty Q1Property =
    DependencyProperty.Register("Q1", typeof(UIElement), typeof(FooCtrl), new UIPropertyMetadata(null));
    public UIElement Q1
    {
      get { return (UIElement)GetValue(Q1Property); }
      set { SetValue(Q1Property, value); }
    }

    // Q2:
    public static readonly DependencyProperty Q2Property =
    DependencyProperty.Register("Q2", typeof(UIElement), typeof(FooCtrl), new UIPropertyMetadata(null));
    public UIElement Q2
    {
      get { return (UIElement)GetValue(Q2Property); }
      set { SetValue(Q2Property, value); }
    }

    // Q3:
    // ....

    // Q4:
    // ....


    public void DoSomething() 
    {
        // ...
    }
}

我使用控件如:

<my:FooCtrl>
<my:FooCtrl.Q1>
    <ContentControl Content="{Binding ...}" /> 
</my:FooCtrl.Q1>
<my:FooCtrl.Q2>
    <ContentControl Content="{Binding ...}" /> 
</my:FooCtrl.Q2>
<my:FooCtrl.Q3>
    <ContentControl Content="{Binding ...}" /> 
</my:FooCtrl.Q3>
<my:FooCtrl.Q4>
    <ContentControl Content="{Binding ...}" /> 
</my:FooCtrl.Q4>

我可以为FooCtrl Q1,Q2,Q3和Q4属性添加4个用户控件。 通过方法&#34; DoSomething()&#34;在FooCtrl上我可以改变动画Q1,Q2,Q3和Q4:

myFooCtrl.DoSomething();

如何从FooCtrl&#34; DoSomething()&#34;中访问该方法?从我的用户控件内部(通过Q1,Q2,Q3,Q4连接)? E.g。如果我将一个usercontrol绑定到Q1-Q4的contentcontrol并且usercontrol包含一个按钮&#34; Do it!&#34;这怎么能访问&#34; DoSomething()&#34;来自FooCtrl,以便它被执行?

如果有帮助:我也使用Caliburn.Micro。

1 个答案:

答案 0 :(得分:0)

如果DoSomething()真的只是基于视图,因为它只是驱动一个动画,并且该动画不代表任何类型的模型状态,那么你可以使用RoutedCommand

您的FooControl可以公开自定义路由命令,以及“执行此操作!”按钮可以绑定到它。路由命令将在可视树中上下移动,直到找到具有匹配命令绑定的内容。在你的情况下,他们会冒泡树,直到他们点击你的FooControl,然后执行命令。

另一种选择是让FooControl公开按钮可以绑定的Attached Properties。就像Grid中的内容可以使用Grid.Row告诉他们的父母他们想要住在哪里。

如果动画DO代表某种模型状态,那么动画应该从ViewModel绑定中驱动。