2010-01-13 11 views
5

Tengo un control con un ComboBox:Cambiar el valor de una propiedad de dependencia dentro de la PropertyChangedCallback para que DependencyProperty

<ComboBox x:Name="TraceComboBox" 
      ItemsSource="{Binding SingleChannelList}" 
      SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, 
         AncestorType={x:Type cc:LogicTriggerSimpleLevelControl}}, 
         Path=SelectedTrace, Mode=TwoWay}"> 

Aquí está la PropertyChangedCallback para la propiedad SelectedTrace en el OuterControl que contiene el ComboBox:

private static void OnSelectedTraceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    OuterControl oc = d as OuterControl ; 
    oc.UpdateSelectedTrace(); 
} 

private void UpdateSelectedTrace() 
{ 
    ViewModelType vm = DataContext as ViewModelType; 
    if (vm != null) 
    { 
     if (vm.SingleChannelList != null) 
     { 
      SelectedTrace = vm.SingleChannelList[0]; 
     } 
    } 
} 

Según mi lógica, debería ocurrir lo siguiente:

Selecciono el tercer objeto en el ComboBox (SingleChannelList[2]) y se produce el controlador de cambios. Luego pasa a la rutina UpdateSelectedTrace(). En este punto, el valor de SelectedTrace es, por supuesto, SingleChannelList[2]. Ahora, la rutina UpdateSelectedTrace() establece forzosamente la propiedad SelectedTrace en el primer objeto de la lista (SingleChannelList[0]), que desencadena otro controlador de cambios anidado dentro del primero. "SelectedTrace" ahora es igual a SingleChannelList [0], por lo que el ComboBox también debería mostrar SingleChannelList [0] como su selección.

todo esto sucede cuando sigo con el depurador hasta que la negrita enfrentado última frase, que en vez juega como esto:

SelectedTrace ahora es igual a SingleChannelList[0], pero las pantallas ComboBoxSingleChannelList[2] como su elemento seleccionado. Intenté UpdatingTarget en el BindingExpression y aún así, la propiedad SelectedTrace tiene el valor SingleChannelList[0] mientras que el ComboBox continúa mostrando SingleChannelList[2]. Estos enlaces son seguros y probados y siempre han funcionado hasta que intenté hacer esto. ¿Alguien puede decirme por qué esto no funciona correctamente?

Gracias

Respuesta

2

Esto suena como un escenario para la propiedad de dependencia 'valor de la coacción'. La coerción de valor 'empuja' el valor de la propiedad a un valor válido basado en un valor deseado. Lea más sobre esto aquí:

Dependency Property Callbacks and Validation

+1

Encontré que dado que el cambio original proviene de la caja que está cambiando, esto todavía no funciona. En su lugar, configuro la caja una vez que todo está hecho y funciona bien. Hacky pero funciona La verdadera pregunta es ¿POR QUÉ no funciona mi escenario original? – Kamiikoneko

0

Creo que esto es una optimización del rendimiento por el marco WPF. El origen de la actualización de la propiedad no obtiene un evento de cambio de propiedad (bueno, el equivalente de enlace) para volver a actualizarse, ya que es el origen del cambio. Puede forzar una actualización utilizando un IdentityConverter (ValueConverter que solo devuelve el valor pasado) en el enlace.

Cuestiones relacionadas