2012-03-16 21 views
10

Che cosa determina l'ordine in cui vengono valutati più DepDencyProperties sullo stesso controllo?Ordinare che i collegamenti DependencyProperties siano valutati?

Sto usando il Extended WPF Toolkit PropertyGrid e hanno entrambi SelectedObject e PropertyDefinitions vincolati:

<extToolkit:PropertyGrid AutoGenerateProperties="False" SelectedObject="{Binding ActiveDataPoint}" PropertyDefinitions="{Binding ActiveDataPoint.Properties}"> 

Il problema è che i fuochi OnSelectedObjectChanged dalla proprietà di dipendenza, e in quel cambiato gestore si fa riferimento PropertyDefinitions, che è vedere come null. Se commento il gestore OnSelectedObjectChanged, posso vedere quando il debugging di OnPropertyDefinitionsChanged viene chiamato DOPO la chiamata a OnSelectedObjectChanged.

public static readonly DependencyProperty PropertyDefinitionsProperty = DependencyProperty.Register("PropertyDefinitions", typeof(PropertyDefinitionCollection), typeof(PropertyGrid), new UIPropertyMetadata(null, OnPropertyDefinitionsChanged)); 
public PropertyDefinitionCollection PropertyDefinitions 
{ 
    get 
    { 
    return (PropertyDefinitionCollection)GetValue(PropertyDefinitionsProperty); 
    } 
    set 
    { 
    SetValue(PropertyDefinitionsProperty, value); 
    } 
} 

private static void OnPropertyDefinitionsChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    Console.Write("I changed!"); 
} 

public static readonly DependencyProperty SelectedObjectProperty = DependencyProperty.Register("SelectedObject", typeof(object), typeof(PropertyGrid), new UIPropertyMetadata(null, OnSelectedObjectChanged)); 
public object SelectedObject 
{ 
    get 
    { 
    return (object)GetValue(SelectedObjectProperty); 
    } 
    set 
    { 
    SetValue(SelectedObjectProperty, value); 
    } 
} 

private static void OnSelectedObjectChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    PropertyGrid propertyInspector = o as PropertyGrid; 
    if(propertyInspector != null) 
    propertyInspector.OnSelectedObjectChanged((object)e.OldValue, (object)e.NewValue); 
} 

Il problema che sto affrontando è discusso su this forum thread, ma sto chiedendo una più generale questione WPF di come posso cambiare l'ordine in cui queste proprietà vengono aggiornate.

Ho provato ad avere più chiamate a NotifyPropertyChanged in ordini diversi ma questo non sembra influenzare questo. Posso fare in modo che l'ordine sia diverso o devo semplicemente modificare il PropertyGrid in modo che funzioni per entrambi gli ordini?

risposta

9

La risposta breve è che è tutto una scatola nera e non si deve fare affidamento su una valutazione prima o dopo un'altra. Quindi l'approccio migliore sarebbe modificare il PropertyGrid in modo che funzioni indipendentemente dall'ordine in cui sono impostate le proprietà.

La risposta lunga è che dipende dall'ordine in cui sono specificati i binding. Così si può fare:

<extToolkit:PropertyGrid AutoGenerateProperties="False" 
    PropertyDefinitions="{Binding ActiveDataPoint.Properties}" 
    SelectedObject="{Binding ActiveDataPoint}" 
    > 

Invece di:

<extToolkit:PropertyGrid AutoGenerateProperties="False" 
    SelectedObject="{Binding ActiveDataPoint}" 
    PropertyDefinitions="{Binding ActiveDataPoint.Properties}" 
    > 

Anche in questo caso, sarebbe una cattiva pratica di fare affidamento su questo. E questa stranezza potrebbe funzionare solo quando il controllo è inizializzato. Le modifiche a ActiveDataPoint o DataContext in seguito, potrebbero comportare un ordine diverso.

8

E solo un altro contro-esempio per confermare quanto è stato detto già

... a mai fare affidamento su ordine di proprietà viene applicata

In una consuetudine UserControl con definito DependencyProperty -ies (.NET 4.5 ecc.): come PropertyChangedCallbacks vengono richiamati all'inizializzazione ...

l'ordine effettivo è determinato dall'ordine di "codice dietro defi nizioni "(campi statici)

... Sto indovinando che ha a che fare con l'ordine di registrazione.

In alcuni altri casi l'ordine dipende da come le proprietà sono allineate in XAML.

Problemi correlati