2017-11-08 17 views
-1

databound 속성 검사를 도와주세요.FrameworkElement.GetBindingExpression은 데이터 바인딩 된 요소에 대해 null을 반환합니다.

내가 특정 속성에 대한 XAML에서 사용 바인딩 된 여부를 그래서 내가 쓴 한 코드
var uielement = something as FrameworkElement; 
if (uielement != null) 
{ 
    var sizeBinding = new[] { FrameworkElement.WidthProperty, FrameworkElement.HeightProperty }.Select(_ => uielement.GetBindingExpression(_)).ToList(); 
    if (sizeBinding.Count(_ => _ != null) > 0) 
    { 
     Trace.WriteLine(string.Format("found {0} bindings", sizeBinding.Count())); 
    } 
} 

처럼 내가 Height와 XAML 요소에이 문제를 확인했습니다 및 Width 속성에 바인딩 확인하고 싶습니다

데이터 컨텍스트

<UserControl Width="{Binding Size.Width, Mode=TwoWay}" 
Height="{Binding Size.Height, Mode=TwoWay}" 
> ... </UserControl> 

이 워크 부재 너비 및 높이의 속성을 가지고 그 속성에 바인딩이 적용되었다 (GetBindingExpression 방법을 사용하여) 검사한다. 크기는 System.Windows.Size 형식의 데이터 컨텍스트 개체의 속성입니다.

위의 C# 코드는 xaml 코드에서 올바르게 작동합니다. 그러나 식 바인딩

<UserControl Width="{Binding Size.Width}" 
Height="{Binding Size.Height, Mode=TwoWay}" 
> ... </UserControl> 

처럼 simpliest 형태를 갖는 경우 다음 sizeBinding는 제 1 엘리먼트 (폭)과 높이가 널 바인딩 식 결합 인스턴스를 갖는다. Mode = TwoWay with binding으로 살 수는 있지만 Mode가 TwoWay로 설정되어 있지 않으면 바인딩 인스턴스가 생성되지 않은 이유를 알고 싶습니다. 나는 표현이 더 복잡한 다음 경로가 필요하기 때문에 이것이라고 생각했습니다. 그러나 나는 Width="{Binding Size.Width, Mode=OneWay}"을 시도했지만 GetBindingExpression은 이와 같은 바인딩에 대해 null을 반환합니다. BindingOperations GetBinding * 메서드를 시도했지만 정확히 FrameworkElement.GetBindingExpression과 똑같은 동작을합니다.

내가봤을 유일한 질문은 this one입니다. 하지만 그것은 나를 위해 명확하지 않다

답변

2

이유는 확실히 당신이 명시 적으로 UserControl의 Width 속성을 어딘가에, 바인딩이 설립 된 후 설정합니다.

이렇게하면 OneWay Binding이 제거되고 (즉, 또 다른 local value으로 바뀝니다) TwoWay Binding이 그대로 유지되고 source 속성이 업데이트됩니다.

+0

당신 말이 맞아요. 나는'Uid' 속성을 바인딩하려고 시도했고 GetBindingEpression이 작동합니다. 그러나 폭과 높이가 명시 적으로 설정된 곳을 찾지 못했습니다. 컨트롤이 렌더링 될 때 wpf 엔진에서있을 수 있습니다. 설명해 주셔서 감사합니다. – oleksa