wpf binding combobox dependency-properties selecteditem

wpf - Combobox ''SelectedItem vinculado a DependencyProperty no es refrescante



binding dependency-properties (2)

Tengo un cuadro combinado, cuyo SelectedItem está vinculado a una propiedad de dependencia.

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>)));

Y el xaml:

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

Los datos están correctamente enlazados y mostrados, pero cuando selecciono otro valor en el cuadro combinado, no se llama al set , ni tampoco se LoadThings() mi método LoadThings() .

¿Hay alguna razón obvia?

Gracias por adelantado

Editar

Utilicé el snoop para ver dentro del cuadro combinado, y cuando cambio el valor, el cuadro combinado ''SelectedItem también cambia.
También verifiqué el código y la propiedad cambió. Pero mi método no es llamado (ya que no reviso el set , entonces el problema todavía está allí ...


Desde MSDN

En circunstancias excepcionales, las implementaciones de su envoltorio solo deben realizar las acciones GetValue y SetValue, respectivamente. El motivo para esto se trata en el tema Propiedades de carga y dependencia de XAML.

Y ahí puedes leer

El procesador XAML de WPF utiliza métodos de sistema de propiedad para propiedades de dependencia al cargar XAML binario y atributos de procesamiento que son propiedades de dependencia. Esto evita de manera efectiva los envoltorios de propiedad.


Ok, encontré cómo hacer eso.

Declaro mi DependencyProperty usando la sobrecarga con la devolución de llamada de esta manera:

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

Y en la devolución de llamada, hago esto:

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