2013-06-12 3 views
1

내 응용 프로그램은 모든 유형이 동일한 계층 적 주문 항목이있는 TreeView를 왼쪽에 표시합니다. 모든 항목에는 두 개의 값 중 하나를 가질 수있는 종속성 속성이 있습니다. 이 값은 enum입니다. 이 값에 따라 왼쪽에 두 개의 UserControl 중 하나를 표시하려고합니다. 내 생각은 두 컨트롤을 삽입하고 불투명도를 0으로 설정하는 것이 었습니다. 그런 다음 열거 형 값에 따라 불투명도를 트리거하는 DataTrigger가있는 스타일을 삽입하려고합니다. 그러나 다른 컨트롤의 DataTrigger에서 한 컨트롤의 속성에 액세스 할 수 없습니다. 트리거가 열거 형 값을 인식하지 못하는 것 같습니다.TreeViewItem의 속성에 따라 WPF UserControl을 변경하십시오.

열거 형 :

public enum IdentityType 
{ 
    Person, 
    OrganisationUnit 
} 

XAML은 :

<TreeView Grid.Column="0" Grid.Row="1" Background="AntiqueWhite" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Identities}" x:Name="OiTree"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Childs}"> 
      <TextBlock Text="{Binding}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

<Controls:UcPerson Grid.Column="1" Grid.Row="1" Opacity="0"> 
    <Controls:UcPerson.Style> 
     <Style TargetType="Controls:UcPerson"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Type, ElementName=OiTree.SelectedItem}" Value="Person"> 
        <Setter Property="Opacity" Value="1"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Controls:UcPerson.Style> 
</Controls:UcPerson> 

<Controls:UcOrgUnit Grid.Column="1" Grid.Row="1" Opacity="0"> 
    <Controls:UcOrgUnit.Style> 
     <Style TargetType="Controls:UcOrgUnit"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Type, ElementName=OiTree.SelectedItem}" Value="OrganisationUnit"> 
        <Setter Property="Opacity" Value="1"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Controls:UcOrgUnit.Style> 
</Controls:UcOrgUnit> 

답변

1

Andrew가 내 문제의 해결책은 DataTemplateSelector라고 암시했듯이. 두 개의 userControls 대신 두 개의 템플릿을 만들고 ContentControl을 사용했습니다. ContentControl의 content 속성은 TreeView의 SelectedItem에 바인딩되어 있으며 사용할 원본 템플릿을 결정하는 원본 개체에 내용을 캐스팅하는 간단한 DataTemplateSelector를 구현했습니다. 소스는 (변형 된) 여기서이다

:

<Window.Resources> 
    <DataTemplate x:Key="borderTemplate"> 
     <Border BorderThickness="1" BorderBrush="Brown" CornerRadius="5"> 
      <TextBlock Margin="5" Text="Border Template"/> 
     </Border> 
    </DataTemplate> 
    <DataTemplate x:Key="twoTextBlockTemplate"> 
     <StackPanel> 
      <TextBlock Margin="5" Text="First TextBlock"/> 
      <TextBlock Margin="5" Text="Second TextBlock"/> 
     </StackPanel> 
    </DataTemplate> 
    <vm:OiContentTemplateSelector 
     x:Key="myContentTemplateSelector" 
     BorderTemplate="{StaticResource borderTemplate}" 
     TwoTextBlockTemplate="{StaticResource twoTextBlockTemplate}"/> 
</Window.Resources> 

가 DataTemplateSelector이다 link

이것은 XAML이고

public class OiContentTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate BorderTemplate 
    { get; set; } 

    public DataTemplate TwoTextBlockTemplate 
    { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     OrganisationIdentity value = item as OrganisationIdentity; 

     if (value != null) 
     { 
      if (value.Type == IdentityType.Person) 
       return BorderTemplate; 
      else if (value.Type == IdentityType.OrganisationUnit) 
       return TwoTextBlockTemplate; 
      return base.SelectTemplate(item, container); 
     } 
     else 
      return base.SelectTemplate(item, container); 
    } 
} 

아마도 도움이 될 것입니다.

1

문제는 먼저 컨트롤에 직접 Opacity를 설정하는 것입니다.

컨트롤의 명시적인 설정은 항상 트리거 값보다 우선합니다.

그러나 트리거 값은 스타일 설정기를 무시합니다.

다음 코드는 (내가 나 자신을 시험하지 않았다 비록)

<Controls:UcPerson Grid.Column="1" Grid.Row="1"> 
    <Controls:UcPerson.Style> 
     <Style TargetType="Controls:UcPerson"> 
      <Style.Setters> 
       <Setter Property="Opacity" Value="0" /> 
      </Style.Setters> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Type, ElementName=OiTree.SelectedItem}" Value="Person"> 
        <Setter Property="Opacity" Value="1"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Controls:UcPerson.Style> 

일 문제의 또 다른 예를 들어 여기이 질문을 참조해야합니다, 내가 믿는으로 DataTrigger not firing


제외 DataTemplateSelector을 사용하면 문제를 더 우아하게 해결할 수 있습니다.

+0

빠른 답변 주셔서 감사합니다. 나는 당신이 옳다고 생각하고 DataTemplateSelector가 내가 필요한 바로 그 것이다. 하지만 지금 당장 얻지 못하는 것은 GridView에서 DataTemplateSelector를 설정하거나 TreeView에서 selectedItem에 대한 Refference를 설정하는 것입니다. 나는 # 주제에 대한 다음 자습서를 읽었습니다. [link] (http://www.codeproject.com/Articles/418250/WPF-Based-Dynamic-DataTemplateSelector) [link] (http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector) –