2016-07-27 2 views
-2

У меня есть пользовательский элемент управленияTwoWay привязки между свойства зависимостей таможенного контроля и ViewModel

class SearchComboBox : ComboBox, INotifyPropertyChanged 
{ 
    public static readonly DependencyProperty ChoosenItemProperty = DependencyProperty.Register(
    "ChoosenItem", 
    typeof(ISearchable), 
    typeof(SearchComboBox)) 

    public ISearchable ChoosenItem 
    { 
     get 
     { 
      return (ISearchable)GetValue(ChoosenItemProperty); 
     } 

     set 
     { 
      SetValue(SearcherProperty, value); 
     } 
    } 

     private void SearchComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     {   
      var selected = this.SelectedItem as ISearchable; 
      ChoosenItem = selected; 
     } 
} 

В XAML я связать свою кодовую свойство ViewModel:

<controls:SearchComboBox ChoosenItem="{Binding SearchableAuthor, Mode=TwoWay}" Width="219"/> 

И VM свойство связывать:

public ISearchable SearchableAuthor 
    { 
     get 
     { 
      return searchAuthor; 
     } 
     set 
     { 
      searchAuthor = value; 
      OnPropertyChanged("SearchableAuthor"); 
     } 
    } 

Когда я изменяю ChoosenItem в пользовательском управлении SearchableAuthor из VM chan ges тоже, но когда я пытаюсь изменить SearchableAuthor, ChoosenItem остается неизменным. Как обновить это свойство из ViewModel?

+0

Вы уверены, что выбрали 'var selected'? Кроме того, это ошибка типовой дополнительной скобки: 'SetValue (ChoosenItemProperty, (ISearchable)'? Что такое 'SetValue' btw? –

+0

@FirstStep Да, я попытался заменить' ISearchable' на тип 'string' - тот же результат. – adray

+0

Итак, если вы изменили 'SearchableAuthor', сеттер для' ChoosenItem' никогда не срабатывает? –

ответ

0

Filally Я получил решение - добавить ValueChanged слушателю свойства зависимостей:

public TestBindingButton() : base() 
    { 
     this.Click += TestBindingButton_Click; 
     var prop = DependencyPropertyDescriptor.FromProperty(ChoosenItemProperty, typeof(TestBindingButton)); 
     prop.AddValueChanged(this, SourceChangedHandler); 

    } 

и вручную доступа:

void SourceChangedHandler(object sender, EventArgs e) 
    { 
     this.Content = ChoosenItem; 
    } 

Пример проекта для демонстрации того, что я пытался достичь: TwoWayBinding

0

Добавить RelativeSource или ElementName, чтобы заставить его работать.

<controls:SearchComboBox ChoosenItem="{Binding SearchableAuthor, 
    RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
    Mode=TwoWay}" Width="219"/> 

<controls:SearchComboBox ChoosenItem="{Binding SearchableAuthor, 
    RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
    Mode=TwoWay}" Width="219"/> 

Вам также может понадобиться установить на DataContext управления к себе

public control() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 
} 
+0

К сожалению, это не сработало – adray

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