2013-06-12 20 views
1

我的應用程序的屬性顯示在左側用分層有序的項目;這些都是同一類型的一個TreeView。所有項目都有一個依賴項屬性,它可以具有兩個值之一。該值是一個枚舉。根據這個值,我想顯示左邊的兩個用戶控件之一。我的想法是插入兩個控件,並將其不透明度設置爲0.然後,我想插入一個帶有DataTrigger的Style,根據枚舉值觸發不透明度。但是我無法從其他控件的DataTrigger訪問一個控件的屬性;並且觸發器似乎不能識別枚舉值。更改WPF用戶控件取決於一個TreeViewItem

枚舉:

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

安德魯暗示的解決我的問題是DataTemplateSelector。我創建了兩個模板,並使用了一個ContentControl,而不是兩個userControls。 ContentControl的content屬性綁定到TreeView的SelectedItem,我實現了一個簡單的DataTemplateSelector,它將內容轉換爲原始對象並決定使用哪個模板。源(經修飾)是從這裏:link

這是XAML:

<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:

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正是我所需要的。但是我現在得不到的是我如何爲一個網格設置DataTemplateSelector(或者更好的只是一個用於控制所需目的的UserControl)並且參照TreeView中的selectedItem。我已閱讀關於該主題的以下教程:[link](http://www.codeproject.com/Articles/418250/WPF-Based-Dynamic-DataTemplateSelector)[link](http://tech.pro/tutorial/807/WPF的教程如何使用的-A-datatemplateselector) –