9

メインのビューモデルに特定のリストを持たせ、他の多くのビューモデルからアクセスしたい。

たとえば、MainViewModel.cs には 50 個の数字のリストがあり、NumListViewModel.cs ではそれにアクセスしてリストとして表示し、AddNumViewModel.cs ではできるようにしたいと考えています。そのリストを更新します。

events / evenaggerator を使用することが提案されていますが、残念ながら、それでできることは、あるビューから別のビューに num を送信し、リストを更新するように指示することだけですが、問題は次のとおりです。プログラムが大きくなると、メイン ビュー モデルに多くのサブスクライバーが必要になり、実際に何かが発生すると、サブスクライバーの数に応じてイベントを「発行」する必要があり、維持がさらに難しくなります。

また、mainVM への参照である「this」に設定されたパラメーターを使用して、mainVM 内に anotherVM のインスタンスを作成するように指示する別の回答も見つけました。動作しますが、かなり長くなる可能性があります。

私の質問は、別の VM からプロパティにアクセスするためのより良い方法はありますか?
文字通り、mainVM にリストを保持するクラスのインスタンスがあり、どの VM ができるかを明示的にプログラムしなくても、他の VM から更新/アクセスできるようになります。生活がとても楽になります。

あなたの答えでは、フレームワークを提案しないようにしてください。すごくいいものもあるけど、それくらいは自分でできるようになりたい。

例えば:

MainVM.cs:

public class MainVM
{
    List lst = new List(); //Let's just say it's full...
}

その他の VM.cs:

public class OtherVM
{
    lst.Add(3);
}

PS:はい、すでに質問されていることは知っています。はい、調査を行いましたが、見つけた答えは「静的」すぎると思いますか?

4

1 に答える 1

20

外部 ViewModel からリストに直接アクセスする場合は、次のオプションがあります。

  1. リストをコンストラクター引数またはパブリック プロパティとして OtherVM に渡します。その後、OtherVM はそれをメンバーのように扱うことができます。

  2. MainVM をコンストラクター引数またはパブリック プロパティとして OtherVM に渡します。次に、OtherVM は、最初に MainVM にアクセスすることによってリストにアクセスできます。

  3. MainVM に "Default" または "Instance" と呼ばれる静的プロパティを与えて、メンバー フィールドとして割り当てることなく、OtherVM 内から MainVM の静的インスタンスにアクセスできるようにします。

例:

public class MainVM
{
    private static MainVM _instance = new MainVM();
    public static MainVM Instance { get { return _instance; } }

    public List<XX> MyList { get; set; }
    //other stuff here
}

//From within OtherVM:
MainVM.Instance.MyList.Add(stuff);
于 2013-05-12T11:56:25.447 に答える