別のユーザー コントロール 'B' を子として持つユーザー コントロール 'A' があります。ユースケースのシナリオは、ユーザーが「A」のボタンをクリックすると、「B」に何らかの情報 (通常は「B」の状態に関連する) を処理して結果を取得するように要求する必要があり、その結果は何らかの計算で使用されます。 「A」で。
現在、MVVM パターンを使用しています。「A」のビューモデルには、A または B の UI への参照がありません。まさにこれを探しています。ユーザーが「A」の UI のボタンをクリックすると、「B」でコマンドを呼び出す必要があります。 '、'A' のビューモデルでデリゲートをパラメーターとしてそのコマンドに渡すことによって。このようにして、'B' のコマンドが情報を処理するときに、'A' から渡されたコールバック関数を呼び出すことができます。
現在、デリゲートはパラメーターなしです。ユーザーコントロール 'B' のコマンドが何らかの情報を処理すると、状態が更新されます。この状態は、'A' のビューモデル内のプロパティにバインドされる依存プロパティです。
このようなことを達成する方法はありますか?
現在、実用的なソリューションがあります。しかし、私はコードを即興で改善したいと考えています。これは、この問題に対する現在の一時的な回避策です。
ユーザーが「A」のボタンをクリックすると、「A」(xaml.cs) にイベント ハンドラーがあります。イベントハンドラーでは、'B' の参照があるので、'B' のコマンドが実行できるかどうかを確認して呼び出します。次に、コマンド ('A' のビューモデル内) を実行できるかどうかを確認し、それを呼び出します。
私の質問が十分に説明的でない場合は、それをサポートするコード サンプルを次に示します。
'A' の XAML:
<bNameSpace:B x:Name="BObject" DepenPropertyInB="{Binding PropInA, Mode=OneWayToSource}"/>
....
<telerik:RadButton Content="Process" HorizontalAlignment="Right" Height="30" Width="80" Grid.Column="2" Click="ProcessButton_Click" />
A の XAML.cs:
private void ProcessButton_Click(object sender, RoutedEventArgs e)
{
if (BObject.StateDataRequestedCommand.CanExecute(""))
BObject.StateDataRequestedCommand.Execute("");
if(ViewModel.ProcessInfoRequestedCommand.CanExecute(""))
ViewModel.ProcessInfoRequestedCommand.Execute("");
}
A の ViewModel:
private void OnProcessInfoRequestedCommand(string anyValue)
{
// read the value of PropInA and do some processing
}
Bのビューモデル:
private void OnStateDataRequestedCommand(string anyValue)
{
// Bases on B's state do some calc and update DepenPropertyInB
}