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