2012-03-16 2 views
10

Qu'est-ce qui détermine l'ordre dans lequel plusieurs propriétés DepdencyProperties sur le même contrôle sont évaluées?Ordonner que les liaisons DependencyProperties sont évaluées?

J'utilise le Extended WPF Toolkit PropertyGrid et qui ont à la fois selectedObject et PropertyDefinitions lié:

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

Le problème est que les feux OnSelectedObjectChanged de la propriété de dépendance, et ce gestionnaire a changé fait référence PropertyDefinitions, qui est voyant comme nul. Si je commente le gestionnaire OnSelectedObjectChanged, je peux voir lors du débogage que OnPropertyDefinitionsChanged est appelé APRES l'appel à 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); 
} 

Le problème que je suis confronté est discuté sur this forum thread, mais je pose une question plus générale WPF de la façon dont je peux changer l'ordre que ces propriétés sont mises à jour.

J'ai essayé d'avoir plusieurs appels à NotifyPropertyChanged dans différents ordres mais cela ne semble pas affecter cela. Puis-je faire en sorte que la commande soit différente ou devrais-je simplement modifier le PropertyGrid pour qu'il fonctionne pour l'une ou l'autre commande?

Répondre

9

La réponse courte est qu'il s'agit d'une boîte noire et que vous ne devriez pas vous fier à une évaluation avant ou après une autre. La meilleure approche serait donc de modifier le PropertyGrid pour qu'il fonctionne indépendamment de l'ordre dans lequel les propriétés sont définies.

La réponse longue est que cela dépend de la façon dont l'ordre dans lequel les liaisons sont spécifiées. Ainsi, vous pouvez faire:

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

Au lieu de:

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

Encore une fois, ce serait une mauvaise pratique de compter sur ce point. Et cette bizarrerie ne peut fonctionner que lorsque le contrôle est initialisé. Les changements au ActiveDataPoint ou au DataContext plus tard, peuvent entraîner une commande différente.

8

Et juste une contre-exemple pour confirmer ce qui a déjà été dit

... de ne jamais compter sur l'ordre des propriétés étant appliqué

Dans une coutume UserControl avec défini DependencyProperty -ies (.NET 4.5 etc.) - comme PropertyChangedCallbacks sont appelés à l'initialisation ...

l'ordre réel est déterminé à partir de l'ordre de "code derrière defi nitions "(champs statiques)

... Je suppose que cela a à voir avec l'ordre d'enregistrement.

Dans certains cas, l'ordre dépend de la manière dont les propriétés sont alignées dans le code XAML.

Questions connexes