2013-11-19 3 views
3

По сути, у меня есть основное окно с пользовательским элементом управления, содержащим свойство, привязанное к модели представления главного окна. Идея заключается в том, что когда свойство изменяется в пользовательской форме, что при привязке свойство в главном окне также изменится viewmodel. Проблема в том, что это работает, когда пользовательский элемент управления не имеет ViewModel, когда я добавляю простой ViewModel в пользовательский элемент управления, привязка больше не работает. И поскольку мне нужно иметь ViewModel для моего контроля, мне нужно выяснить, почему добавление ViewModel нарушает привязку и как ее исправлять. Любые предложения приветствуются.Свойство Dependency binding usercontrol с viewmodel

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 (в MainWindow):

<myCtrl:Control1 SavedString="{Binding Path=SavedString, Mode=TwoWay}"/> 

CS (мой УНЦ ViewMode):

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

ответ

6

Когда UC имеет собственный Vm, т.е. он собственный DataContext, вам нужно (Окно) DataContext

<myCtrl:Control1 SavedString="{Binding RelativeSource={RelativeSource 
    AncestorType=Window} Path=DataContext.SavedString, Mode=TwoWay}"/> 
+0

это сработало хорошо спасибо – phcoding

+0

@phcoding это имело значение, если вы написали его с дорогой до RelativeSource? –

+0

@phcoding, была ли причина, по которой вы отправили ответный пример обратно пользователю, который ответил вам? Это кажется ненужным. – Sheridan

Смежные вопросы