Proprietà dipendenza che associa usercontrol a un viewmodel

Essenzialmente, ho una finestra principale con un controllo utente su di esso contenente una proprietà che è legata al modello di vista della finestra principale. L’idea è che quando la proprietà cambia nel modulo utente, anche il binding della proprietà nella finestra principale viewmodel cambierà. Il problema è che questo funziona quando il controllo utente non ha ViewModel, quando aggiungo un semplice ViewModel al controllo utente, il binding non funziona più. E poiché ho bisogno di avere un ViewModel per il mio controllo ho bisogno di capire perché l’aggiunta di ViewModel sta rompendo l’associazione e come risolverlo. Qualsiasi suggerimento accolto.

public partial class Control1 : UserControl, INotifyPropertyChanged { public Control1() { InitializeComponent(); Loaded += Control1_Loaded; } void Control1_Loaded(object sender, RoutedEventArgs e) { DataContext = new Control1ViewModel(); } public static DependencyProperty SavedStringProperty = DependencyProperty.Register( "SavedString", typeof(string), typeof(Control1)); public string SavedString { get { return (string)GetValue(SavedStringProperty); } set { SetValue(SavedStringProperty, value); } } public event PropertyChangedEventHandler PropertyChanged; private void FirePropChanged(string property) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(property)); } private void Button_Click_1(object sender, RoutedEventArgs e) { SavedString = "Hi"; } } public class MainWindowViewModel : INotifyPropertyChanged { private string _message = "Hi"; public string myMessage { get { return _message; } set { _message = value; FirePropChanged("myMessage"); } } public event PropertyChangedEventHandler PropertyChanged; private void FirePropChanged(string property) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(property)); } private string _savedString; public string SavedString { get { return _savedString; } set { _savedString = value; FirePropChanged("SavedString"); } } } 

xaml (in MainWindow):

  

cs (my uc viewmode):

  public class Control1ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; } 

Quando il tuo UC ha il suo Vm, cioè il suo DataContext, devi scalare l’albero visivo e fare riferimento al DataContext del suo genitore (Finestra)

  

C’è un altro modo per scriverlo con un nome di elemento:

 SavedStrings="{Binding ElementName=uc_name, Path=DataContext.SavedString}"