2012-03-16 11 views
10

Co decyduje o tym, jak ocenia się wiele DepdencyProperties dla tej samej kontroli?Zamawia się, że powiązania DependencyProperties są oceniane?

Używam Extended WPF Toolkit PropertyGrid i mają zarówno SelectedObject i PropertyDefinitions zobowiązana:

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

Problemem jest to, że OnSelectedObjectChanged pożary od obiektu uzależnienia iw tym zmienionym obsługi jest przedstawieniu PropertyDefinitions, który jest widząc jako zero. Jeśli skomentuję instrukcję obsługi OnSelectedObjectChanged, wówczas zobaczę, kiedy debugowanie, że zmienna OnPropertyDefinitionsChanged jest wywoływana po wywołaniu 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); 
} 

Problem jestem stoi omówiono na this forum thread, ale pytam bardziej ogólny WPF pytanie, jak mogę zmienić kolejność, że właściwości te są aktualizowane.

Próbowałem wielu połączeń do NotifyPropertyChanged w różnych zamówieniach, ale wydaje się, że nie ma to wpływu na to. Czy mogę spowodować, że zamówienie będzie inne, czy też powinienem zmodyfikować właściwość PropertyGrid tak, aby działała dla każdego z tych zamówień?

Odpowiedz

9

Krótka odpowiedź brzmi, że jest to czarna skrzynka i nie należy polegać na tym, który jest oceniany przed lub za drugim. Najlepszym rozwiązaniem byłoby zmodyfikowanie PropertyGrid, aby działało niezależnie od kolejności ustawiania właściwości.

Długa odpowiedź wygląda tak, jak zależy od kolejności powiązań. Więc można zrobić:

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

Zamiast:

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

Znowu byłoby złą praktyką polegać na tym. I to dziwactwo może działać tylko wtedy, gdy kontrola jest zainicjowana. Zmiany na ActiveDataPoint lub później DataContext mogą spowodować inną kolejność.

8

I jeszcze jedna przeciwwskazane przykład, aby potwierdzić to, co zostało powiedziane już

... nigdy nie polegać na zlecenie właściwości są stosowane

W zwyczaju UserControl z definicją DependencyProperty -ies (.NET 4.5 itd.) - jak PropertyChangedCallbacks są wywoływane podczas inicjalizacji ...

rzeczywista kolejność jest określona na podstawie kolejności "code behind defi" nitions "(pola statyczne)

... Zgaduję, że ma to związek z kolejnością rejestracji.

W niektórych innych przypadkach kolejność zależy od sposobu zestawienia właściwości w XAML.

Powiązane problemy