2010-01-13 17 views
5

Ho un controllo con un ComboBox:Cambiando il valore di un DependencyProperty all'interno del PropertyChangedCallback per quella DependencyProperty

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

Ecco il PropertyChangedCallback per la proprietà SelectedTrace nel OuterControl contenente la 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]; 
     } 
    } 
} 

Secondo la mia logica, dovrebbe succedere quanto segue:

I selec t il terzo oggetto nello ComboBox (SingleChannelList[2]) e si verifica il gestore delle modifiche. Passa quindi alla routine UpdateSelectedTrace(). A questo punto, il valore di SelectedTrace è ovviamente SingleChannelList[2]. Ora, la routine UpdateSelectedTrace() imposta forzatamente la proprietà SelectedTrace sul primo oggetto nell'elenco (SingleChannelList[0]), che attiva un altro gestore di modifiche nidificato all'interno del primo. "SelectedTrace" ora equivale a SingleChannelList [0], quindi anche il ComboBox dovrebbe mostrare SingleChannelList [0] come selezione.

Tutto ciò avviene quando seguo con il debugger fino a quando l'ultima frase in grassetto-affrontato, che gioca invece come questo:

SelectedTrace ora uguale SingleChannelList[0], ma i ComboBox display SingleChannelList[2] come la sua voce selezionata. Ho provato UpdatingTarget su BindingExpression e ancora, la proprietàdetiene il valore SingleChannelList[0] mentre il continua a mostrare SingleChannelList[2]. Questi attacchi sono sicuri e testati e hanno sempre funzionato fino a quando non ho provato a farlo. Qualcuno può dirmi perché questo non funziona correttamente?

si

risposta

2

Grazie Questo suona come uno scenario per proprietà di dipendenza 'valore coercizione'. La forzatura del valore "spinge" il valore della proprietà su un valore valido basato su un valore desiderato. Per saperne di più su di esso qui:

Dependency Property Callbacks and Validation

+1

Ho trovato che dato che la modifica originale proviene dalla casella che sta cambiando, questo ancora non funziona. Invece mi limito a impostare la scatola dopo che tutto è finito e funziona bene. Hacky ma funziona. La vera domanda è perché il mio scenario originale non funziona? – Kamiikoneko

0

Credo che questo sia un ottimizzazione delle prestazioni dal framework WPF. L'origine dell'aggiornamento della proprietà non ottiene un evento propertychanged (beh, l'equivalente vincolante) per aggiornarsi di nuovo, poiché è l'origine della modifica. È possibile forzare un aggiornamento utilizzando un IdentityConverter (ValueConverter che restituisce appena il valore passato) nel Binding.

Problemi correlati