2016-03-20 20 views
0

私はTextという文字列プロパティを含むクラスを持っています。MVVMのUserControlにクラスプロパティをバインドする

public class Time 
    { 
     private string _text; 
     public string Text 
     { 
      get { return _text; } 
      set { _text = value; } 
     } 
    } 

このクラスを含むカスタムのUserControlもあります。私のViewModelから

public partial class MyUserControl : UserControl, INotifyPropertyChanged 
{ 
<...> 
    private Time _myTime; 
    public Time MyTime 
    { 
      get { return _myTime; } 
      set { _myTime= value; NotifyPropertyChanged(); } 
    } 
} 

、私は上記のユーザーコントロールを作成してタイムクラスを割り当てると、そのすべてのプロパティ:

void SomeMethod() 
{ 
    Time TestTime = new Time(); 
    TestTime.Text = "Hello world"; 

    MyUserControl control = new MyUserControl(); 
    control.MyTime = TestTime; 

    controlViewer = new System.Collections.ObjectModel.ObservableCollection<Control>(); 
    controlViewer.Add(control); 
     // on my main window, I have an ItemsControl with 
     // ItemsSource="{Binding controlViewer}". 
} 

ユーザーコントロールのためのXAMLは、このテキストボックスが含まれています

<TextBox Text="{Binding MyTime.Text}"/> 

私は、program.MyTime.Textプロパティをプログラムで呼び出すことができ、 "Hello world"値を取得することはできますが、新しく作成したMyUserControl テキストボックス。

答えて

2

バインディングのソースオブジェクトをUserControlインスタンスに設定する必要があります。このようのバインディングRelativeSourceプロパティを設定することにより:そのほかに

<TextBox Text="{Binding MyTime.Text, 
       RelativeSource={RelativeSource AncestorType=UserControl}}"/> 

、ビュー要素でINotifyPropertyChangedインターフェイスを実装することは珍しいです。代わりに、依存関係プロパティとしてMyTimeを宣言する可能性があります

public static readonly DependencyProperty MyTimeProperty = 
    DependencyProperty.Register("MyTime", typeof(Time), typeof(MyControl)); 

public Time MyTime 
{ 
    get { return (Time)GetValue(MyTimeProperty); } 
    set { SetValue(MyTimeProperty, value); } 
} 
+0

- ありがとう! – Fish

0

あなたのViewModelにユーザーコントロールを作成するにはとても良い方法ではありません。 (リストビュー/ ListBoxのは、彼らが選択できるよう以来、優れている)

  1. のItemsControlとXAMLのメインウィンドウを作成します。 次の方法でそれを行うようにしてください。
  2. TimeクラスオブジェクトのObservableCollectionでViewModelを作成し、このViewModelをビューモデルとしてMainWindowにバインドします。
  3. コレクションに表示するオブジェクトでViewModelを初期化します。
  4. UserControlを使用して、各ItemsControlコレクションメンバーのDataTemplateを定義します。それをしなかった

よろしく、

関連する問題