プリズムを使用してWPFアプリケーション内の別のViewModelsから1つのコマンドを何らかの方法で実行できますか?異なるViewModelsから同じプリズムコマンドを実行
私は何を意味するか説明しましょう。
私はMainMenuViewModelクラスを持っている:
public class MainMenuViewModel
{
private ICommand _aboutCommand;
public ICommand AboutCommand
{
get
{
if (_aboutCommand == null)
{
_aboutCommand = new DelegateCommand(() =>
{ MessageBox.Show("About menu item clicked!"); });
}
return _aboutCommand;
}
}
}
もこのモデルのビューがあります:
<Menu IsMainMenu="True">
<MenuItem Header="Nápověda">
<MenuItem Header="O Aplikaci" x:Name="About"
Command="{Binding AboutCommand}" />
</MenuItem>
</Menu>
同じ動作でコマンドを実行する必要があるアプリケーション内の別のモジュールがあり、 (またはおそらくより良い - 同じコマンド):
public class MunisatorViewModel
{
private ICommand _aboutCommandInAnotherModule;
public ICommand AboutCommandInAnotherModule
{
get
{
if (_aboutCommandInAnotherModule== null)
{
_aboutCommandInAnotherModule= new DelegateCommand(() =>
{ MessageBox.Show("About menu item clicked!"); });
}
return _aboutCommandInAnotherModule;
}
}
}
このモジュールには表示:
<StackPanel Background="White" HorizontalAlignment="Center" VerticalAlignment="Top">
<Button cmd:Click.Command="{Binding AboutCommandInAnotherModule}">About</Button>
</StackPanel>
重複するコードを避けることはできますか?
P.S.私は、この2つのViewModelの基本クラスを作成し、そこにこのコマンドを記述できることを理解していますが、ViewModelのいくつかはすでに異なる基本クラスを持っているという問題があります。
私はEventAggregatorについて知っていますが、重複したコードを避けるためにこの状況では役立ちません。 – msi
はい、そうです... MainMenuViewModelはaboutメニューを表示するためのコードを実装します。また、AboutCommandFiredというイベントにサブスクライブし、MunisatorViewModelがそのイベントを公開します。 MainMenuViewModelでは、匿名メソッドから実装を移動して、DelegateCommandとイベントアグリゲータの両方から呼び出すこともできます。 – lecrank
しかし、この場合でも、コマンドを作成するためのコードを複製し、異なるコマンドをビューに割り当てる必要があります。私の質問は、別のビューのSAMEコマンド実装を使用することが可能な場合でした。 – msi