2

我的应用程序中有一个 MainWindow。在 MainWindow 中,我动态地托管了一个用户控件 (ucA)。在 ucA 中,我有另一个用户控件 (ucB)。

当我点击 ucB 上的保存按钮时,我需要在 ucA 上执行一个例程。

如何参考 ucA 上的例程?

4

1 回答 1

1

以下是我能想到的一些方法:-

您可以CallMethodAction在您的 xaml 中使用来调用父用户控件的方法。代码是这样的: -

<UserControl x:Class="WpfApplication.ucB"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
     Height="300" Width="300">
<StackPanel>
    <Button Content="Save" x:Name="SaveButton" >
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <ei:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorLevel=2, AncestorType=UserControl}}"
                                MethodName="MethodToCallOnucA" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>        

</StackPanel>

这样您就可以在 ucA 上调用该方法,它是 ucB 的父级。但是这种从 xaml 调用方法的方式有很大的限制。限制是,在这种情况下,您的 `MethodToCallOnucA' 必须返回 void 并且必须没有方法参数。

如果您必须向您的方法发送参数,那么您需要在此处遵循第二种方法。为此,我们需要使用命令来调用用户控件的方法。您需要像这样在上面的 xaml 中更改按钮的代码:-

<Button Content="Save" x:Name="SaveButton" >
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorLevel=2, AncestorType=UserControl}, Path=DoActionCommand}" CommandParameter="ValueToSendAsMethodParameter" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>

这里 DoActionCommand 是在您的用户控件 ucA 中定义的 ICommand 属性,此 ICommand 指向您需要在 ucA 中调用的方法。

于 2013-05-22T18:19:12.503 回答