2014-10-07 4 views
0

사용자 정의 UserControl 중 어떤 개체에 바인딩으로 DataContext을 설정하고 있습니다. 또한 부모 개체의 부울에 바인딩을 기반으로 컨트롤을 사용하거나 사용하지 않도록 설정하려고합니다. 그러나 데이터 컨텍스트가 설정 되 자마자 시스템은 이전 데이터 컨텍스트 대신 새 데이터 컨텍스트의 다른 모든 바인딩을 찾으려고 시도합니다. (이 어쨌든 나에게 조금 이상한 것 같다.)DataContext가 이미 설정된 경우 바인딩을 만드는 방법

public class Animal 
{ 
    public string Name; 
} 

public class Zoo 
{ 
    public Zoo() 
    { 
     AnimalOnDisplay = new AnimalOnDisplay { Name = "Tyrannosaurus" }; 
    } 

    public bool ZooIsClosed; 
    public Animal AnimalOnDisplay; 
} 

static void Main() 
{ 
    ZooUserControl control = new ZooUserControl(); 
    control.DataContext = new Zoo(); 
    control.Show(); 
} 

XAML :

<UserControl x:Class="MyProgramme.ZooUserControl" 
      xmlns:zoo="clr-namespace:Zoo.UserControls"> 
    <StackPanel> 

     <Label Content="Welcome!" /> 
     <zoo:AnimalUserControl DataContext="{Binding AnimalOnDisplay}" 
           IsEnabled="{Binding ZooIsClosed}" /> 

    </StackPanel> 
</UserControl> 

위의 사용자 컨트롤의 DataContextZoo의 올바른 예 (나는 이것을 확인)입니다. 다음과 같은 오류가 발생합니다 :

System.Windows.Data Error: 40 : BindingExpression path error: 'ZooIsClosed' property not found on 'object' ''Animal`1' (HashCode=44290843)'. 
           BindingExpression:Path=ZooIsClosed; DataItem='Animal`1' (HashCode=44290843); target element is 'AnimalUserControl' (Name=''); 
           target property is 'IsEnabled' (type 'Boolean') 

분명히 잘못된 위치에 ZooIsClosed을 찾고 있습니다. 이 같은 현재 DataContext에 바인딩하려고 : 같은 오류가 발생하고, 어느 동작하지 않는 ElementName

IsEnabled="{Binding ZooIsClosed, RelativeSource={RelativeSource Self}}" 

합니다.

올바른 변수 (예 : ZooIsClosed : Zoo)에 어떻게 바인딩 할 수 있습니까?

답변

0

AnimalOnDisplay 속성에서 ZooIsClosed이라는 속성을 검색하도록 바인딩을 요청합니다. 우리는 당신의 코드에서이 관계가 존재하지 않는다는 것을 알 수 있습니다.

모두 ZooIsClosedAnimalOnDisplayZoo 클래스의 속성을하기 때문에, 그래서 당신은 당신의 Zoo 클래스 인스턴스로의 DataContext를 설정해야 할 일 (당신의 ZooControl있는 동물원 예를 DependencyProperty를 가정), 다음, 즉 해당 인스턴스의 속성에 바인딩 IsZooClosedAnimalOnDisplay. 이 같은 UserControl까지 추적 RelativeSource를 사용하여

<UserControl x:Class="MyProgramme.ZooUserControl" 
     xmlns:zoo="clr-namespace:Zoo.UserControls" 
     DataContext="{Binding Zoo.DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type zoo:ZooControl}}}"> 
    <StackPanel> 
     <Label Content="Welcome!" /> 
     <zoo:AnimalUserControl IsEnabled="{Binding ZooIsClosed}" /> 
    </StackPanel> 
</UserControl> 
+0

당신 말이 맞아요, 제 질문은 불분명하고 불완전합니다. 나는 그것을 편집했다 : 사용자 정의 컨트롤의'DataContext'는'Zoo' 클래스의 유효한 인스턴스입니다. 이제 문제는 조금 더 명확 해졌습니다. AnimalUserControl은 다른 DataContext를 필요로하지만, IsEnabled는 현재의 것과 바인딩되어야합니다. – Yellow

1

당신은 IsEnabled에 대한 Binding을 설정할 수 있습니다 : 여기

은 당신의 요구에 맞는 경우 코드의 비트, 당신은 시작할 수 보는 것입니다

<zoo:AnimalUserControl DataContext="{Binding AnimalOnDisplay}" 
     IsEnabled="{Binding DataContext.ZooIsClosed, 
        RelativeSource={RelativeSource AncestorType=UserControl}}"/> 

PathDataContext.ZooIsClosed으로 설정됩니다.

또한 모델이 제대로 작성되지 않았습니다 (단지 설명이되기를 바랍니다).

+1

예, 작동합니다. 감사합니다! (나는 모델이 시범적이고 테스트되지 않았으며 의심의 여지없이 오류를 포함하고 있음을 알고있다.) – Yellow

관련 문제