もくじ
やりたいこと
ある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間でなくても、どこからでも呼べてしまいそうなので、変な使い方すると後で大変になりそう。