2012-03-16 2 views
10

같은 컨트롤의 여러 DependencyProperties가 평가되는 순서를 결정하는 것은 무엇입니까?DependencyProperties 바인딩을 평가하도록 명령 하시겠습니까?

나는 구속 SelectedObject 및 PropertyDefinitions 모두를 Extended WPF Toolkit PropertyGrid가를 사용하고 있습니다 오전 :

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

문제는 종속성 속성에서 OnSelectedObjectChanged 화재가, 그 변경된 핸들러에서 인 PropertyDefinitions을 참조하고 있다는 것입니다 null로 본다. OnSelectedObjectChanged 핸들러를 주석 처리하면 OnSelectedObjectChanged를 호출 한 후 OnPropertyDefinitionsChanged가 디버깅 될 때를 볼 수 있습니다.

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); 
} 

내가 직면하고 문제는 this forum thread에 설명되어 있습니다,하지만 난 이러한 속성이 업데이트되는 순서를 변경하는 방법의 일반적인 WPF의 질문을하고있다.

여러 주문을 여러 번 호출하려고 시도했지만 NotifyPropertyChanged가이 문제에 영향을 미치지 않습니다. 주문을 다르게하거나 PropertyGrid를 수정하여 어느 쪽 주문으로도 사용할 수 있습니까?

답변

9

대답은 모두 검은 색 상자이므로 다른 사람 앞뒤로 평가되는 것에 의존해서는 안됩니다. 따라서 가장 좋은 방법은 PropertyGrid를 수정하여 속성이 설정된 순서와 관계없이 작동하도록하는 것입니다.

긴 대답은 바인딩이 지정되는 순서에 따라 달라집니다. 그래서 당신은 할 수 있습니다 :

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

대신 :

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

다시 말하지만,이에 의존하는 나쁜 관행이 될 것입니다. 그리고이 특징은 컨트롤이 초기화 될 때만 작동합니다. ActiveDataPoint 또는 DataContext으로 변경하면 순서가 달라질 수 있습니다.

8

그리고 하나 더 콘트라 예는 DependencyProperty 정의와 정의 UserControl에서

적용되는 속성의 순서에 의존 결코 ... 이미

을 밝혔다 된 내용을 확인합니다 -ies (.NET 4.5 등) - 초기화시 PropertyChangedCallbacks가 호출 됨 ...

실제 순서는 "defi code behind defi natives "(정적 필드)

... 나는 등록 순서와 관련이 있다고 생각합니다.

다른 경우에는 순서가 속성이 XAML에 정렬되는 방식에 따라 다릅니다.

관련 문제