2011-09-26 5 views
0

마크 업 확장 프로그램을 작성하고 있습니다. 나는 생성자가 하나 개의 문자열 인수를 복용이현재 바인딩 값

<TextBlock Text="{ui:Test SomeInfo}" /> 

및 TestExtension 같은 XAML 있습니다. "SomeInfo"문자열이 나옵니다. 그래서 모든 것이 발견됩니다. 이제 내선 번호를 중첩하고 다음과 같이 작성하고 싶습니다.

<TextBlock Text="{ui:Test {Binding PropName}}" /> 

그리고 그대로 작동하지 않습니다. System.Windows.Data.Binding 유형의 인수를 취하는 생성자를 추가해야했습니다.

는 지금은

  1. 가 어떻게 바인딩 개체에서 현재 값을 검색해야 알 필요가?
  2. 언제해야합니까? ProvideValue 메서드에서 매번 변경 사항을 구독하거나 그 값을 요청해야합니까?

갱신 1 PROPNAME는 TextBlock에의 DataContext에 대해 해결해야합니다. 당신의 MarkupExtensionDataContext이 없기 때문에이 같은 How do I resolve the value of a databinding?

답변

4

바인딩이 작동하지 않습니다 그것은 시각적 트리에 표시되지 않으며, 난 당신이 바인딩과 상호 작용하기로되어 있다고 생각하지 않습니다

갱신 2 그냥 관련 질문을 발견 개체를 직접. 이 확장 프로그램이 정말로 필요합니까? 어쩌면 당신은 단 하나의 바인딩과 converter으로 할 수 있을까요?

당신이 이 (DependencyObject에서 상속) 바인딩 속성을 가진 전용 클래스를 만들 수되지 않은 경우,이 그러나 아직도 그렇게 ElementName에 필요한 DataContext 또는 namescope 또는 RelativeSource에 필요한 시각적 트리를주지 못할 것이다 그 상황에서 바인딩 작업을 수행하는 유일한 방법은 Source을 사용하는 것입니다 (예 : StaticResource으로 설정). 이것은 거의 이상적이지 않습니다.

바인딩을 직접 설정하지 않으면 ProvideValue 메서드는 한 번만 호출됩니다. 즉, 확장에 바인딩이 있어도 매우 유용 할 수는 없습니다 (일부 예외가 있습니다. 예를 들어 돌아올 때 복잡한 내용, 예를 들어 ItemsControl 바인딩을 사용하지만, 문자열을 TextBlock.Text에 설정하면됩니다. 따라서 바인딩을 기반으로 값이 동적으로 변경되어야하는 경우 이처럼 MarkupExtension을 사용하고 싶지는 않습니다. 앞에서 언급 한 것처럼 다양한 값 대신 converters 또는 MultiBindings을 고려하십시오.

+0

실제로 Textblock의 DataContext를 사용하고 싶습니다. – adontz

+0

@adontz : 앞에서 말했듯이, 보통의 Binding with converter를 사용하는 것이 더 나을 것입니다. 자신의 MarkupExtension 내부의 바인딩을 작동시키는 것이 고통입니다. –

+0

마크 업 사용자에게 중요한 일관성있는 구문을 제공하기 때문에이 고통을 받아들입니다. – adontz