2012-03-22 13 views
1

背景:MVVMのユーザーコントロールにデータを渡すパターン

私は、ユーザーコントロールを含むメインウィンドウでWPFアプリケーションを使用しています。私は、メインウィンドウからユーザーコントロールに値を渡したいと思います。

私は、コードを持っているメインウィンドウのコンストラクタで

public MainWindow() 
    { 
     InitializeComponent(); 
     _vm = new MainWindowViewModel(); 
     this.DataContext = _vm; 
     ucControl = new UserControl1("NameSet"); 
    } 

(ucControlは私のユーザーコントロールである)

ユーザーコントロールは、2つのコンストラクタがあります。

public UserControl1() 
    { 
     InitializeComponent(); 
     this.ID = ID.GetNewID; 
    } 

    public UserControl1(string name) 
    { 
     InitializeComponent(); 
     _vm = new UCViewModel(name); 
     this.DataContext = _vm; 
     this.ID = ID.GetNewID; 
    } 

問題は次のとおりですが、 2番目のコンストラクタ(withパラメータ)が呼び出されたとき、メインウィンドウにロードされません。私は、ユーザーコントロールのロードされたイベントでID(this.ID)をチェックし、そのIDがデフォルトのコンストラクタに設定されていて、そのDataContextがnullであることがわかりました。この理由のため、私は自分のユーザーコントロールに「名前」文字列を取得しません。

お願いします。私はMVVMパターンを使用しているので、私はユーザーコントロール(ビュー)のプロパティをこのためにメインウィンドウから設定することは望ましくありません。

+0

そこからこのユーザーコントロールをロードしました..さらにコードを表示します –

+0

ユーザーコントロールはメインウィンドウのxamlにあります。 thewpfguy

+0

私は質問がhttp://stackoverflow.com/questions/4802278/how-do-you-pass-parameters-fromに似ていると思います-xaml。それが助けになるだろう。 –

答えて

1

あなたは二回のUserControl1オブジェクトをインスタンス化されています

  1. を一度XAML内。 < uc:UserControl1 >要素は、デフォルトコンストラクタを使用してUserControl1オブジェクトをインスタンス化し、それをメンバucControlに割り当てます。

  2. はあなたがユーザーコントロールのコンストラクタにブレークポイントを置いた場合、あなたはそれが2回呼び出され気づくメイン・ウィンドウオブジェクト

のコンストラクタ以内に再度それをインスタンス化します。私は、上記の#2の動的UserControlを割り当てた後、WPFがインスタンス化してXAMLのUserControl(上から#1)を初期化すると仮定しているため、MainWindowの論理ツリーに前者が表示されます。

インスタンスは1つだけ必要です。ユーザーコントロールをパラメータ化する場合、標準的なパラダイムは、あなたがしたくないこと(なぜ?)を言います。あなたは、このような性質を持っていた場合は、XAMLでそれを設定できます< UC:UserControl1のは、X:このような性質をさらす名=「...」YourProperty = "名前セット>

は、ユーザーコントロール内の単一の行です:

public YourProperty { get; set; } 

あなたはこのラインを持っていないの主張する場合、次の操作を行う必要があります。

  1. XAMLのユーザーコントロールを削除
  2. のメインウィンドウで、Loadedイベントをサブスクライブ
  3. Loadedイベントのハンドラで、必要な任意のコンストラクタパラメータを使用して、新しいUserControl1をインスタンス化します。
  4. 手動明らかにこれは私の推奨するものではなく、親Grid要素

の子配列に追加します。複雑さに加えて、前者の方法では、Visual Studioデザイナでもうまく動作します。

+1

ご返信ありがとうございます。私は、ユーザーコントロールのビューモデルで "名前"プロパティを持っています。どうすれば設定できますか?もちろん、これはうまくいかないでしょう - thewpfguy

+0

この目的のために、ユーザーコントロールクラスのビューモデルですべてのプロパティを複製する必要がありますか? – thewpfguy

+0

これはDataContext.Nameに失敗し、コード内のucControl.DataContextにアクセスするだけです。 – Silvermind

関連する問題