アプリケーションに 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>
このようにして、ucB の親である ucA でメソッドを呼び出すことができます。しかし、xaml からメソッドを呼び出すこの方法には大きな制限があります。制限は、この場合、`MethodToCallOnucA' が void を返す必要があり、メソッド パラメータを持たない必要があることです。
メソッドにパラメーターを送信する必要がある場合は、ここで 2 番目のアプローチに従う必要があります。このためには、コマンドを使用して Usercontrol のメソッドを呼び出す必要があります。上記の 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 で呼び出す必要があるメソッドを指しています。