2009-11-02 4 views
6

데이터에 바인딩 된 컨트롤 집합이 있는데, 여기에 프로그래밍 방식으로 바인딩에 유효성 검사기를 추가하고 싶습니다. 현재 시각적 트리를 반복하여 바인딩이있는 컨트롤을 찾고이 컨트롤에 유효성 검사기를 추가 할 수 있습니다. 그러나 어느 컨트롤이 특정 유효성 검사를 가져야하는지 더 자세히 지정하려면 스타일을 사용하고 싶었습니다. 그래서 내 XAML은 다음과 같습니다 : 여기스타일이 지정된 WPF DependencyObject를 사용하면 코드에서 스타일 키를 어떻게 얻을 수 있습니까?

<TextBox Name="someTextBox" Style="{StaticResource optionalNumericTextBox}" /> 

optionalNumericTextBox 스타일은 모두 유효성 검사 오류 템플릿을 추가하고이 텍스트 상자가 선택 숫자 검증이 적용된해야 함을 표시하는 장식 역할을합니다.

이 문제는 시각적 트리를 탐색하고 바인딩이있는 컨트롤을 발견 한 다음 사용중인 스타일을 결정해야 할 때 발생합니다. 현재 내가 나에게 a Style 객체를 제공하지만, 지금까지 내가 말할 수있는,이 객체가 'optionalNumericTextBox'값을 수행하지 않습니다

dependencyObject.GetValue(FrameworkElement.StyleProperty) 

을 시도했습니다. XAML 판독기에서 키를 확인하거나이 정보를 잃어 버렸습니까?

답변

5

StaticResourceExtension을 사용하는 경우 XAML을 BAML로 변환 할 때 컴파일시이 정보가 손실됩니다. 반대로 DynamicResourceExtension을 사용하면 런타임시 자원을 확인할 수 있도록 키가 유지됩니다. 키에 얻으려면, 당신은 ReadLocalValue()를 사용해야합니다 :

//this gets the Style 
var s = textbox.GetValue(TextBox.StyleProperty); 
//this gets a ResourceReferenceExpression 
var l = textbox.ReadLocalValue(TextBox.StyleProperty); 

문제는, ResourceReferenceExpression 내부 유형, 당신은 열쇠를 꺼내 반사를 사용해야합니다 그래서.

대신에 Tag 속성을 하이재킹 한 것으로 간주 했습니까?

<Style x:Key="optionalNumericTextBox" TargetType="TextBox"> 
    <Setter Property="Tag" Value="optionalNumericTextBox"/> 
</Style> 

그런 다음 코드는 단순히 TextBoxTag 속성을 확인할 수 있습니다.

+0

거기에 멋진 팁, 속성 설정기를 사용합니다. 사실 태그 대신 첨부 된 속성을 사용하는 방향으로 나를 가리켰다. 이제 다음과 같은 것을 사용합니다 : 매력처럼 작동합니다! –