[WPF] あるView/ViewModelから、別のView/ViewModelのメソッドを呼びたいとき


やりたいこと

あるViewModelから、別のViewModelのメソッドをどうしても呼びたいということがあった。
無理やり感があるが、その時に試したやり方をメモ。

サンプル

どちらのView/ViewModelにも属さないシングルトンのクラスを用意して、そこにdelegate(Action)を持たせる。

そこに、呼ばれたい側のViewModelでGetInstanceして、呼ばれたいメソッドを登録する。
その後、呼びたい側のViewModelでGetInstanceして、呼びたいメソッドを呼ぶ。

メソッドを登録するシングルトンのクラス.cs
    public sealed class FunctionManager
    {
        private static FunctionManager _instance = new FunctionManager();
        public static FunctionManager GetInstance() => _instance;
        private FunctionManager() { }

        // 呼びたい/呼ばれたいメソッドを登録するAction
        public Action MyFunc = null;
    }
呼ばれたい側のViewModel.cs
    class ViewModel : BindingBase
    {
        FunctionManager fm = FunctionManager.GetInstance();

        public ViewModel()
        {
            fm.MyFunc += (()=>
            {
                Debug.WriteLine("Func呼びました。");
            });
        }
    }
呼びたい側のViewModel.cs
    class ViewModel2 : BindingBase
    {
        FunctionManager fm = FunctionManager.GetInstance();

        public ViewModel2() { }

        public void Yobu()
        {
            fm.MyFunc?.Invoke();
        }
    }

※これがよいやり方なのかどうかは不明。
 DIコンテナを使って、ここでいうところのFunctionManagerクラス(位置づけ的にはModelか)を、両ViewModelにオブジェクト注入してやれば何となくそれっぽくなるのかも?

※別にViewModel間でなくても、どこからでも呼べてしまいそうなので、変な使い方すると後で大変になりそう。