2013-04-08 3 views
2

바인딩에 문제가 있습니다. RelativeSource가 여행을 원하는 조상을 찾을 수있는 시각적 트리를 필요로하기 때문에, 당신은 단지 UIElement에서 사용할 수 있습니다하지만 난 RelativeSource이 비 UIElement에 구속력을하려고 오전 ValidationRule입니다 같은되는 등 모두 VisualTree도 아니고 UIElement 인지도 모릅니다. 당신은 구속력이 깨지는 것을 기대할 수 있습니다. RelativeSource을 찾을 수 없습니다. 내가 말한 것처럼 VisualTree 또는 LogicalTree을 사용할 수 없습니다. 나는 그것을 작동하게 할 필요가있다. 내가 DependencyObject에이 할 수 DepObjClass 전화에서 유도체 클래스를 만들 수 있었다 때문에비 UIElement에 바인딩

<StackPanel DataContext{Binding}> 
    <Grid> 
    <ContentControl Content{Binding MVPart1> 
     <TextBox> 
     <TextBox.Text> 
     <Binding Path="VMPart1Property1"> 
     <Binding.ValidationRules> 
      <my:MyValidationRule> 
      <my:ValidationRule.DOC> 
      <my:DepObjClass DepProp={Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}}/> 
      </my:ValidationRule.DOC> 
      </Binding.ValidationRules> 
     </Binding> 
     </TextBox.Text> 
     </TextBox> 
    </ContentControl> 
    </Grid> 
</StackPanel> 

그래서 기본적으로 MyValidationRule이 ValidationRule 클래스에서 derivering하지만, UIElement에도 DependencyObject에하지 이잖아과 : 여기

는 XAML의 예입니다 xaml 바인딩 표현식을 써주세요.
public class MyValidationRule : ValidationRule 
{ 
    public DepObjClass DOC 
    { 
    get; 
    set; 
    } 

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     string text = value as string; 
     if (!string.IsNullOrEmpty(text)) 
     { 
     return new ValidationResult(true, string.Empty); 
     } 

     return new ValidationResult(false, "Not working blahhh"); 
    } 
} 

public class DepObjClass : DependencyObject 
{ 
    public object DepProp 
    { 
    get 
    { 
     return (object)GetValue(DepPropProperty); 
    } 
    set 
    { 
     SetValue(DepPropProperty, value); 
    } 
    } 

    public static DependencyProperty DepPropProperty 
    = DependencyProperty.Register(typeof(object), typeof(DepObjClass)......); 
} 

지금 요약하기 : 여기

는 코드입니다. MyValidatonRule은 DependencyObject가 아닌 UIElement는 아니지만 형식의 속성을 가지므로 xaml 바인딩식이 컴파일됩니다.

나는 StackPanel의이 ValidationRule 나던 VisualTree을 가지고 있기 때문에도 내 유효성 검사 규칙은 논리 또는 Visual 트리에 참여 찾을 수 couldnt는 때문에 작업 자체를 밤은 바인딩 응용 프로그램을 실행할 때.

질문은, 어떻게 같은 내 ValidationRule 같은 비 UIElement에서 StackPanel에를 찾기 위해 나는 이러한 경우 작업을 어떻게입니까?

내 코드는 comipiling이 아니라고 사과하지만, 내가 뭘 하려는지 이해할 수 있기를 바랍니다. 저는 올바른 답을 얻기 위해 50 점을주고 있습니다.

+0

[이] (같은 아마 뭔가 http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF) 도울 수있다. – dowhilefor

+0

정확히 달성하려는 것은 무엇입니까?당신의 MyValidationRule 클래스는'DependencyObject' 타입의 프로퍼티를 가지고 있습니다 만 실제로 그것을 사용하지는 않습니다. –

+0

그렇다면 dependeyobject는 dependencyproperty를 가지고 있고 xaml에서 바인딩을하고 있지만 바인딩 자체가 visualtree에 참여하지 않아 visualtree에서 작동하지 않기 때문에 바인딩이되지 않습니다. 어떻게 작동하게합니까? –

답변

3

는 다음과 같은 작업을 수행 할 수 있습니다

  1. 는 Freezable에서 파생하고 바인딩 원하는 것을 위해하는 DependencyProperty를 정의하는 도우미 구성 요소를 만듭니다.

  2. 이미 수행 한 것과 유사한 헬퍼 구성 요소의 개체를 사용하는 속성으로 ValidationRule을 만듭니다.

  3. 는 바인딩 원하는대로 결합 할 수있는 개체의 자료에 도우미 구성 요소의 인스턴스를 선언합니다. Freezable과 파생 클래스는 리소스가 선언 된 컨트롤의 바인딩 컨텍스트 (논리 트리의 위치)를 상속하므로 바인딩을 만들 수 있습니다. ValidationRule를 선언 할 때는

  4. 은 ValidationRule의 속성에 도우미 구성 요소를 할당 {정적 리소스}를 사용합니다. StaticResource는 자원이 사용되기 전에 선언되는 한 바인딩 컨텍스트없이 작동합니다.

XAML은 다음과 같이 보일 것이다 :

<StackPanel> 
    <StackPanel.Resources> 
    <my:Helper x:Key="helper" ValProperty="{Binding}"/> 
    </StackPanel.Resources> 
    <Grid> 
     <TextBox DataContext="{Binding MVPart1}"> 
     <TextBox.Text> 
     <Binding Path="VMPart1Property1"> 
     <Binding.ValidationRules> 
      <my:MyValidationRule Helper="{StaticResource helper}"/> 
      </Binding.ValidationRules> 
     </Binding> 
     </TextBox.Text> 
     </TextBox> 
    </Grid> 
</StackPanel> 
+0

내가 말했듯이 이것은 Freezable의 전문 기술입니다. 다른 클래스에서 작동하지 않는다고 말하면 올바른 것입니다. 그러나 예를 들어 Style에서 Binding을 사용할 수 있습니다. Style은 Freezable에서 파생 되었기 때문입니다. DataContext는 바인딩이 선언 된 곳에서 사용할 수 있어야하며 Freezables는 리소스로 선언 된 경우에도 상속합니다. 도우미가 ValidationRule로 설정되면 Binding이 이미 적용됩니다. 나는 당신이 그것을 시도하는 것이 좋습니다 ... – hbarck

+0

나는 나의 이전 코멘트를 삭제했습니다. 이것은 더 낫다. 어떻게 설명 할 수 있습니까? 리소스의 도우미가 DataContext에 대해 알고 있습니다. 리소스에는 DataContext가 없습니다. DataContext는 A CONTROL 초기화시 StaticResources가 확인되면 호출됩니다. 리소스의 개체는 DataContext에 대해 알지 못하지만 실행 시간의 어느 시점에서 컨트롤에서 호출 된 후에는 알 수 있습니다. 그래서 질문은 DataContext가 FrameworkElement가 아닌 ValidationRule에 대한 것입니까? ValidationRule은 VisualTree에도 없습니다. –

+0

스타일은 컨트롤의 초기화시 스타일이 DataContext가되는 방식을 호출 할 때 호출됩니다. 어쩌면 스타일이 좋은 예가 될 수 있습니다. –