0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-06-23

もくじ

やりたいこと

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

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?