2015-12-22 2 views
1

Я знаю, название немного запутанно, поэтому позвольте мне объяснить. У меня есть пользовательский элемент управления, у которого есть свойство зависимости. Я обращаюсь к этому свойству зависимостей с регулярным свойством Input. В моей модели модели у меня также есть свойство Input. У меня есть эти два свойства связаны друг с другом в XAML, используя двухстороннюю связывания, как показано ниже:Двусторонняя привязка к свойству зависимостей в пользовательском элементе управления и вызов метода

<uc:rdtDisplay x:Name="rdtDisplay" Input="{Binding Input, Mode=TwoWay}" Line1="{Binding myRdt.Line1}" Line2="{Binding myRdt.Line2}" Height="175" Width="99" Canvas.Left="627" Canvas.Top="10"/> 

Хорошо в моей модели представления, я вызвать метод всякий раз, когда значение входного сигнала не изменится, как показано на моей собственности:

public string Input 
     { 
      get 
      { 
       return input; 
      } 
      set 
      { 
       input = value; 
       InputChanged(); 
      } 
     } 

Проблема в том, что когда я устанавливаю значение ввода в моей модели просмотра, он обновляет значение ввода переменной в соответствии с моим установщиком в моем свойстве. Как я могу заставить это обновить свойство зависимостей в пользовательском элементе управления? Если я оставлю код input = value;, тогда я получаю ошибку компиляции.

мне нужно что-то вроде этого:

public string Input 
      { 
       get 
       { 
        return UserControl.Input; 
       } 
       set 
       { 
        UserControl.Input = value; 
        InputChanged(); 
       } 
      } 

Если я свойство ввода на мой взгляд, модель выглядит следующим образом:

public string Input 
     { 
      get; set; 
     } 

то это работает, однако, я не могу назвать InputChanged(), который мне нужно вызвать при изменении свойства. Все предложения приветствуются.

+0

Входной свойство должно быть связано с DependencyProperty. Кажется, вы это делаете, но я не понимаю, почему он не работает. Возможно, вы не создали ViewModel для вашего UserControl, не так ли? Как создать rdtDisplayViewModel, который вы используете внутри UserControl для выполнения всего вашего пользовательского интерфейса? Что-то говорит мне, что ты ушел и сделал это .... – Will

+0

У меня есть код в коде, который находится за моим пользовательским элементом управления, но не отдельная модель представления. – ProgrammingDude

+1

Для двух способов работы ваше свойство ввода CLR должно использовать уведомление об изменении. – AnjumSKhan

ответ

1

Реализовать INotifyPropertyChanged в вашем ViewModel

public class Sample : INotifyPropertyChanged 
{ 
    private string input = string.Empty; 
    public string Input 
    { 
     get 
     { 
      return input; 
     } 
     set 
     { 
      input = value; 
      NotifyPropertyChanged("Input"); 
      InputChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

} 

В вашем случае, вы можете это сделать в коде позади вашего UserControl

+2

Нет, НЕ ДЕЛАЙТЕ ЭТО в «коде позади пользовательского контроля»! Сделайте это в своей модели просмотра. Чтобы стать надежным наследованием от Microsoft.Practices.Prism.ViewModel.NotificationObject и в установщике после InputChanged(); добавить RaisePropertyChanged (() => Input); – gReX

+1

отредактируйте свой ответ, удалив последнее предложение относительно кода позади, см. Мой комментарий. – gReX

+1

Совершенно необязательно, чтобы он создал модель. Поскольку он уже упомянул, что у него нет viewmodel, я предложил это. Если он следовал за MVVM, то, что вы предложили, было правильным. – Subru

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