2017-01-30 7 views
0

私はWPFアプリケーションを構築しています。今まで、ほとんどのViewModelは厳密に独自のコードを操作していました。 私は最近、基底クラス "ApplicationViewModel"を作成して共通コードをその中に移行することに決めました。ほとんどの場合、これは正常に動作しますが、問題が発生しています。View Model Baseクラスのインスタンスを1つだけ保証する方法はありますか?

は、私の継承のviewmodelsは、このベースのviewmodelの独自のインスタンスを産卵していることが表示されます。結果として; ClassAのメソッドが基本クラスの変数を変更した場合、ClassBはnullと同じ変数を登録するか、以前の値が何であってもそれを登録します。

は当初、私は、Microsoftのユニティコンテナにインスタンスを登録しても問題が解決するだろうと思った

public App() 
{ 

    Container.RegisterType<ApplicationViewModel>(new ContainerControlledLifetimeManager()); 
} 

が、それは何も変わっていません。

研究は、静的クラスを有効にした後、私は見つけましたが、私はそのルートを頭の前に、私は別のソリューションを好むだろう明白な答え。私のプログラムの機能の多くが再作業を必要とするかもしれません。

シングルトンインスタンスプロパティが基本クラス宣言でも動作するかどうかはわかりません。

だから私は、私の質問があるとしますすべての私のviewmodels全体で使用されてどのように私はこれのviewmodel基底クラスの同じインスタンスを確実にするでしょうか?

+2

すべてのviewmodelsは、このベースのviewmodelから継承した場合、単一インスタンスの共有が不可能であり、それは意味をなさない。 –

+0

別の角度があります。単一の基本クラスインスタンスのユースケースは何ですか? –

+0

クラス構造の概要を転記します。小さなC#は説明よりはるかに明確です。あなたが描いていることはあまり明らかではありません。 –

答えて

2

このViewModelベースクラスの同じインスタンスがすべてのViewModelで使用されるようにするにはどうすればよいですか?

不可。基本クラスは、それを継承するクラスの定義の一部です。つまり、基本クラスと派生クラスは、同じインスタンスの一部です。 dervivedクラスのインスタンスを作成すると、そのタイプのインスタンスが1つだけ作成されます。基本型はこの型の一部です。

継承の周りの基本クラスのインスタンスが1つだけの場合は、解決策ではありません。

代わりに使用すると、子ビューモデルのそれぞれからContainerを使用して共有ビューモデルオブジェクトへの参照を取得できます。

public class ChildViewModel //doesn't inhert from the base view model 
{ 
    public ChildViewModel() 
    { 
     var sharedViewModel = Container.Resolve<ApplicationViewModel>(); 
     //call any properties or methods of the sharedViewModel... 
    } 
} 
+1

これは教育的だった。多くの感謝。あなたのソリューションは天才でした。 – Offer

0

あなたのviewmodelsは本当に(技術的に)基本クラスから継承する場合、これは継承されたのviewmodelのインスタンスごとに、基本クラスのインスタンスが必要です。

あなたはすべての既存のviewmodelsに平等であるべき、それらの値を格納する、静的クラス(またはシングルトンインスタンス)を作成することで、あなたの問題を解決することができます。

基本クラスには、これらの静的変数を使用する非静的アクセサ(get-setメソッド)が引き続き含まれます。あなたのビューモデルは、実際に値が格納されている場所を知る必要はありません。

これは実際には、静的でないベースクラスのいくつかのフィールド/プロパティを静的に定義することに非常に近いでしょう。だから多分これもオプションになるだろう。

0

申し訳ありませんが、基本クラスの1つのインスタンスで派生クラスの異なるインスタンスを持つ方法はありません。

私はちょうど次のデザインを提案できます。基底クラスのフィールドを作成します。

private static Dictionary<string, object> _hash = new Dictionary<string, object>

と派生クラスの基本クラスで保護されたプロパティを作成:

protected string Title { 
get { 
    string value; 
    ApplicationViewModel._hash.TryGetValue("Title", out value); 
    return value; 
    } 
    set { 
    ApplicationViewModel._hash["Title"] = value; 
    } 
} 

私はそれがあなたのための組曲を願っています。