根据TreeViewItem的属性更改WPF UserControl
我的应用程序在左边显示了一个树状视图,其中包含所有类型相同的分层有序项。所有项都有一个dependency属性,该属性可以有两个值之一。此值是一个枚举。根据这个值,我想在左边显示两个UserControls中的一个。我的想法是插入两个控件并将其不透明度设置为0。然后我想插入一个带有DataTrigger的样式,该样式根据枚举的值触发不透明度。但是我不能从另一个控件的DataTrigger访问一个控件的属性;触发器似乎无法识别枚举的值 枚举:根据TreeViewItem的属性更改WPF UserControl,wpf,enums,selecteditem,datatrigger,Wpf,Enums,Selecteditem,Datatrigger,我的应用程序在左边显示了一个树状视图,其中包含所有类型相同的分层有序项。所有项都有一个dependency属性,该属性可以有两个值之一。此值是一个枚举。根据这个值,我想在左边显示两个UserControls中的一个。我的想法是插入两个控件并将其不透明度设置为0。然后我想插入一个带有DataTrigger的样式,该样式根据枚举的值触发不透明度。但是我不能从另一个控件的DataTrigger访问一个控件的属性;触发器似乎无法识别枚举的值 枚举: public enum IdentityType {
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>
问题在于您首先直接在控件上设置
不透明度
控件上的显式设置将始终覆盖触发器值
但是,触发器值将覆盖样式设置器
下面的代码应该可以工作(尽管我自己还没有测试过)
有关该问题的另一个示例,请参见此处的问题:
顺便说一句,我相信你的问题可以用一个。更优雅地解决,因为Andrew暗示我的问题的解决方案是一个DataTemplateSelector。我创建了两个模板并使用了ContentControl,而不是两个UserControl。ContentControl的content属性绑定到TreeView的SelectedItem,我实现了一个简单的DataTemplateSelector,它将内容强制转换到要使用的原始对象。源(已修改)来自此处:
这是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正是我所需要的。但我现在还不知道如何为网格设置DataTemplateSelector(或者更好的是,只设置一个用户控件,用于安排所需的用途)并在树视图中引用selectedItem。我已经阅读了以下有关该主题的教程:
<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>
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);
}
}