我的应用程序中有一个 MainWindow。在 MainWindow 中,我动态地托管了一个用户控件 (ucA)。在 ucA 中,我有另一个用户控件 (ucB)。
当我点击 ucB 上的保存按钮时,我需要在 ucA 上执行一个例程。
如何参考 ucA 上的例程?
我的应用程序中有一个 MainWindow。在 MainWindow 中,我动态地托管了一个用户控件 (ucA)。在 ucA 中,我有另一个用户控件 (ucB)。
当我点击 ucB 上的保存按钮时,我需要在 ucA 上执行一个例程。
如何参考 ucA 上的例程?
以下是我能想到的一些方法:-
您可以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 中调用的方法。