2016-03-20 15 views
0

Ich habe eine Klasse, die eine String-Eigenschaft namens Text enthält.Klasseneigenschaften an UserControl in MVVM binden

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

Ich habe auch eine benutzerdefinierte UserControl, die diese Klasse enthält.

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

Von meinem Viewmodel, möchte ich die oben Usercontrol schaffen und eine Time-Klasse und alle seine Eigenschaften zuordnen: für das Benutzersteuerelement enthält diese TextBox

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}". 
} 

Die XAML:

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

Ich bin dann in der Lage, die control.MyTime.Text -Eigenschaft programmgesteuert aufzurufen und den "Hallo Welt" -Wert gut zu bekommen - aber ich kann es nicht auf dem neu erstellten MyUserControl anzeigen lassen Textfeld.

Antwort

2

Sie müssen das Quellobjekt der Bindung an die UserControl-Instanz, z. durch Einstellen der RelativeSource Eigenschaft Bindung wie folgt aus:

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

Abgesehen davon, ist es ungewöhnlich, dass die INotifyPropertyChanged Schnittstelle in einem View-Element zu implementieren. Sie könnten stattdessen MyTime als Abhängigkeitseigenschaft deklarieren:

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

Das tat es - danke! – Fish

0

es ist nicht so gut, Praxis das Usercontrol in Ihrem Ansichtsmodell zu erstellen. Versuchen Sie, dass in der nächsten Weise zu tun:

  1. Erstellen Sie das XAML-Hauptfenster mit dem Itemscontrol (das Listview/List-Box ist besser, da sie Auswahl zulassen).
  2. Erstellen Sie das ViewModel mit ObservableCollection von Time-Klassenobjekten, und binden Sie dann dieses ViewModel als Ansichtsmodell an das MainWindow.
  3. Initialisieren Sie das ViewModel mit Objekten, die Sie in Ihrer Sammlung sehen möchten.
  4. Definieren Sie das DataTemplate für jedes ItemsControl-Collection-Member mit Ihrem UserControl.

Grüße,

Verwandte Themen