2010-04-19 4 views
7

일반적으로 데이터 바인딩 된 컨트롤을 '업데이트'하려면 "PropertyChanged"이벤트를 사용하여 데이터가 장면 뒤에서 변경되었음을 인터페이스에 알립니다.변환기를 사용하여 DataContext에 직접 바인드 된 WPF 업데이트 바인딩

예를 들어, 속성 "해당 DisplayText"여기에서

<TextBlock Text="{Binding Path=DisplayText}"/>

, 함께 데이터 컨텍스트에 바인딩 된 본체를 가질 수 DataContext를 다음 PROPERTYNAME로하여 PropertyChanged 이벤트 "해당 DisplayText"을 제기하는 경우 이 텍스트 블록의 텍스트는 업데이트되어야합니다 (바인딩 모드를 변경하지 않았다고 가정).

그러나 컨트롤의 최종 모양과 느낌을 결정하기 위해 datacontext의 여러 속성을 사용하는보다 복잡한 바인딩이 있습니다. 이것을 달성하기 위해, 나는 datacontext에 직접 바인딩하고 변환기를 사용한다. 이 경우 나는 이미지 소스로 작업하고있다. 당신이 볼 수 있듯이

<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>

, 나는 어떤 경로로 {바인딩}가 데이터 컨텍스트에 직접 바인딩하는 데 사용하고, 나는 내가 찾고 이미지를 선택하는 ImageConverter를 사용합니다. 하지만 지금은 바인딩에 업데이트를 알리는 방법이 없습니다. 나는 "."으로 propertychanged 이벤트를 발생 시키려고 노력했다. 성질로서, 그것은 작동하지 않았다.

이것이 가능합니까? 바인딩을 연결할 수있는 속성으로 변환 논리를 마무리해야합니까, 아니면 바인딩을 명시 적으로 새로 고치지 않고 새로 고침을 지시 할 수있는 방법이 있습니까?

도움을 주시면 감사하겠습니다. 감사합니다. -Adam

답변

17

해결 방법은 여기에 단순히 내가이 속성을 사용 바인딩에 그런

public Object Self { get { return this; }}

를 돌려 "자기"라는 내 객체 (데이터 컨텍스트로 사용되는)에 속성을 추가했다 :

내가 전화를 다음

<Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/>

PropertyChanged(this, new PropertyChangedEventArgs("Self"))

그것은 매력처럼 작동합니다.

감사합니다.

+0

감사합니다! 나는 이것을 찾으려고 미친 듯이 내 제안에 나타 났을 때 그것을 묻기 시작했다. – HDD

0

흠, 전체 구현을 표시하지 않습니다. 그러나 GUI에 바인딩 된 값이 PropertyChanged-Event를 제공하면 업데이트해야한다고 생각합니다.

감사

+0

문제는 이미지 소스가 datacontext의 속성이 아니라 datacontext에 직접 바인딩된다는 것입니다. 변환기는 datacontext를 받아들이고 이미지 소스를 반환합니다. datacontext의 속성에 대한 경로가있는 바인딩을 사용하여 해당 속성에 대한 PropertyChanged를 호출하면 업데이트가 발생합니다 (작동). 그러나, 이미지를 결정하기 위해 객체 자체가 필요합니다 (단순한 속성 이상). 감사합니다. – Adam

+0

에는 그 내용을 입력하는 동안 생각이있었습니다. 나는 스스로를 반환하는 "Self"라는 객체에 속성을 추가하려고 시도하고 PropertyChanged ("Self")를 호출하려고합니다. 나는 이것을 줄 것이다. – Adam

2

내가 정확히 현재의 컨버터를 필요 달성의 방법이 생각하지 않습니다. 언급했듯이 ViewModel에서 계산을 수행하거나 변환기를 IMulitValueConverter으로 변경할 수 있습니다.

특정 시나리오 (ViewModel 클래스에 연결된 변환기 및 해당 속성 중 일부)에서 ViewModel에서 논리를 구현하는 방향으로 기울여야합니다.