2010-07-13 4 views
2

모든 Textblocks의 Text 속성을 리 바인드하는이 메서드에서와 같이 특정 유형의 요소에 대한 특정 속성의 모든 인스턴스를 다시 바인딩 할 수 있다는 것을 알고 있습니다. 그래도 난 할 수 있기를 원하는 것은시각적 트리에서 모든 요소의 모든 속성을 다시 바인딩 하시겠습니까?

public void Rebind() 
{ 
    foreach (var textBlock in LayoutRoot.GetDescendents().OfType<TextBlock>()) 
    { 
    BindingExpression bindExp = textBlock.GetBindingExpression(TextBlock.TextProperty); 
    if (bindExp != null) 
    { 
     Binding bind = bindExp.ParentBinding; 
     textBlock.SetBinding(TextBlock.TextProperty, bind); 
    } 
    } 
} 

는 시각적 트리의 모든 요소에 대한 바인딩이있는 모든 속성을 바인딩입니다. 더 구체적으로 특정 값 변환기를 사용하는 모든 바인딩을 리 바인드하고 싶습니다. 내가 어떻게 할 수 있니?

+0

이 요구 사항의 목적은 무엇입니까? – AnthonyWJones

+0

ParentBinding에 값 변환기가 있는지 여부 – Ragunathan

답변

1

FrameworkElement에 현재 적용되는 바인딩 표현식 집합을 열거 할 방법이 없기 때문에 이것은 현실적으로 실현 가능하지 않습니다.

이 작업을 수행하려면 먼저 적용 할 수있는 모든 종속성 속성을 수집해야합니다 (요소 유형 당 적어도 하나 더 복잡해 지지만). 요소 당 각각 GetBindingExpression을 시도하십시오. 진짜 못생긴 진짜 느린.

이 요구 사항을 설계 할 시간입니다.

+0

그건 내가 생각한거야. 모든 속성에 바인딩되지 않은 바인딩을 사용하려고하지만 값 변환기와 해당 매개 변수를 사용하여 ResX 파일이 아닌 리소스를 조회하고 값을 무시하고 반환합니다. 응용 프로그램이 실행되는 동안 (사용자가 번역을 제공 할 수 있음) 자원이 변경 될 수 있으며 하나 이상의 자원이 변경되면 다시 바인딩하려고합니다. –

+0

@ 스티브 (Steve) : 재산에 구속력이 없으므로 해결해야 할 일이 있습니다. 'INotifyPropertyChanged'를 구현하는 더미 클래스를 생성하고 더미 속성을 구현하십시오. 이 더미의 인스턴스를'Application.Resources'에 추가하고이 바인딩들 중 __ALL__을 바인딩합니다. {바인딩 Dummmy, Source = {StaticResource DummyObject}}, Converter = {당신의 변환기 등} 이제 바인딩을 업데이트하려고 할 때 Dummy 속성에 대해'PropertyChanged' 이벤트를 발생 시키려면 Dummy 객체를 얻으십시오. – AnthonyWJones

+0

감사합니다. Anthony, 완벽한 솔루션이라고 생각합니다. –

관련 문제