2013-05-22 4 views
1

У меня есть combobox, чей SelectedItem привязан к свойству зависимости.Combobox 'SelectedItem, связанный с DependencyProperty, не обновляется

public IEnumerable<KeyValuePair<int,string>> AllItems 
{ 
    get { return _AllItems; } 
    set 
    { 
     _AllItems = value; 
     this.NotifyChange(() => AllItems); 
    } 
} 

public KeyValuePair<int, string> SelectedStuff 
{ 
    get { return (KeyValuePair<int, string>)GetValue(SelectedStuffProperty); } 
    set 
    { 
     SetValue(SelectedStuffProperty, value); 
     LoadThings(); 
    } 
} 

public static readonly DependencyProperty SelectedStuffProperty = 
    DependencyProperty.Register("SelectedStuff", typeof(KeyValuePair<int, string>), typeof(MyUserControl), new UIPropertyMetadata(default(KeyValuePair<int, string>))); 

И XAML:

<ComboBox DisplayMemberPath="Value" 
      ItemsSource="{Binding AllItems}" 
      SelectedItem="{Binding SelectedStuff, Mode=TwoWay}" /> 

Данные не правильно связаны и отображается, но при выборе другого значения в выпадающем списке, то set не называется, ни называется мой LoadThings() метод.

Есть ли очевидная причина?

Заранее спасибо


Редактировать

Я использовал Snoop для просмотра в выпадающем списке, а при изменении значения, выпадающий»SelectedItem также изменяется.
Я также проверил в коде, и свойство изменилось. Но мой метод не называется (как я не хожу через set, так что проблема все еще там ...

+1

Есть ли причина SelectedStuffProperty должен быть 'DependencyProperty '? Это берет большую часть контроля из ваших рук и помещает ее в суд суда. В большинстве ситуаций, подобных этому, требуется только стандартное свойство, которое вызывает уведомление об изменении свойств. –

+0

Да, это часть UserControl, из которой я должен получить это значение через привязку в родительском контейнере. – Shimrod

ответ

0

Хорошо, я нашел, как это сделать.

Я заявляю о своем DependencyProperty, используя перегрузку cо спаренной обратного вызова, как это:

public static readonly DependencyProperty SelectedStuffProperty = 
    DependencyProperty.Register("SelectedStuff", typeof(KeyValuePair<int, string>), typeof(MyUserControl), new UIPropertyMetadata(default(KeyValuePair<int, string>), new PropertyChangedCallback(SelectedStuffChanged)); 

И в обратный вызов, я делаю это:

private static void SelectedStuffChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    MyUserControl c = d as MyUserControl; 
    c.LoadThings(); 
} 
3

От MSDN

Во всех, кроме исключительных обстоятельств, ваши реализации обертки должны выполнять только ПолучитьЗначение и SetValue действия, соответственно. причина этого обсуждается в разделе XAML Загрузка и свойств зависимостей.

и there вы можете прочитать

Процессор WPF XAML использует методы системного свойства для зависимости свойства при загрузке двоичных XAML и обработке атрибутов, которые являются свойства зависимостей. Это эффективно обходит свойство обертки.

+0

Спасибо за информацию, теперь я понимаю, почему я не могу использовать точку останова! – Shimrod

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