C# 类型化样式和设置ItemContainerStyle之间的差异

C# 类型化样式和设置ItemContainerStyle之间的差异,c#,wpf,treeview,treeviewitem,C#,Wpf,Treeview,Treeviewitem,我有一个样式用于我的树视图项,目前它适用于所有人,因为他没有键 <Style TargetType="TreeViewItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TreeViewItem"> <

我有一个
样式
用于我的
树视图项
,目前它适用于所有人,因为他没有

<Style TargetType="TreeViewItem">            
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TreeViewItem">
                    <Grid x:Name="gChildren">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>

                        <Rectangle x:Name="HorLin" Grid.Row="0" Height="1" Stroke="Black" SnapsToDevicePixels="True" VerticalAlignment="Bottom" />
                        <Rectangle x:Name="VerLinUp" Grid.Row="1" Width="1" Height="20" Stroke="Black" SnapsToDevicePixels="True" />
                        <Border Name="Bd" Background="{TemplateBinding Background}" BorderBrush="Black" BorderThickness="3" Padding="6" Grid.Row="2" Margin="2,0">
                            <ContentPresenter Name="PART_Header" ContentSource="Header" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>                            
                        <Rectangle x:Name="VerLinDown" Grid.Row="3" Width="1" Height="10" Stroke="Black" SnapsToDevicePixels="True" />
                        <ItemsPresenter x:Name="itemPresenter" Grid.Row="4" HorizontalAlignment="Center"/>
                    </Grid>
                    <ControlTemplate.Triggers>                            
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Items.Count, Converter={StaticResource IsGreaterThanConv}, ConverterParameter=0}" Value="false">
                            <Setter TargetName="VerLinDown" Property="Visibility" Value="Collapsed" />
                        </DataTrigger>                            
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource HasParentMoreChildren}}" Value="false">
                            <Setter TargetName="HorLin" Property="Visibility" Value="Collapsed" />
                        </DataTrigger>                            
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource IsParentTreeViewItem}}" Value="false">
                            <Setter TargetName="VerLinUp" Property="Visibility" Value="Collapsed" />
                        </DataTrigger>                            
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource IsParentTreeViewItem}}" Value="true">
                            <Setter TargetName="VerLinUp" Property="Height" Value="10" />
                        </DataTrigger>                            
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource IsFirstOrLastItem}}" Value="2">
                            <Setter TargetName="HorLin" Property="Width" Value="{Binding ElementName=gChildren, Path=ActualWidth, Converter={StaticResource ArithmeticConverter}, ConverterParameter=/2}" />
                            <Setter TargetName="HorLin" Property="HorizontalAlignment" Value="Right" />
                        </DataTrigger>                            
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource IsFirstOrLastItem}}" Value="1">
                            <Setter TargetName="HorLin" Property="Width" Value="{Binding ElementName=gChildren, Path=ActualWidth, Converter={StaticResource ArithmeticConverter}, ConverterParameter=/2}" />
                            <Setter TargetName="HorLin" Property="HorizontalAlignment" Value="Left" />
                        </DataTrigger>                            
                        <Trigger Property="IsSelected" Value="True">
                            <Setter TargetName="Bd" Property="Panel.Background" Value="{StaticResource SelectedItemAreaBrush}" />
                            <Setter TargetName="Bd" Property="Border.BorderBrush" Value="{StaticResource SelectedItemBorderBrush}" />
                            <Setter TargetName="Bd" Property="TextElement.Foreground" Value="White" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel x:Name="spChildren" HorizontalAlignment="Center" IsItemsHost="True" Margin="4,0,4,6" Orientation="Horizontal" />                        
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>            
    </Style>
将my
TreeView项目
-样式添加到my
TreeView

    TVVerlauf.SetBinding(TreeView.ItemContainerStyleProperty, "GoodTVI");
样式的其余部分保持完全相同。这是唯一的区别,但结果看起来完全不同。

试试这个:

TVVerlauf.SetBinding(TreeView.StyleProperty, "GoodTVI");
我给我的风格起了个名字

事实上,你没有

<Style x:Key="GoodTVI" TargetType="TreeViewItem">
    ...
由于
GoodTVI
是一个资源键,而不是viewmodel上的属性名称,因此您自然不会得到好的结果

在XAML中的
TreeView
上尝试以下操作:

<TreeView
    ItemContainerStyle="{StaticResource GoodTVI}"
    ...other properties...
    >

我的
TreeView
在代码中完全生成。我该如何在代码中设置它?@E-Nuff哦,天哪。你为什么要做那样的事?为什么?好吧,现在你知道在WPF中不要这样做了。更新我的答案——这只是一个精明的猜测,因为我从来没有这样折磨过自己。(更新:或者被我的前任折磨过!)如果你不是项目的原始开发者,情况就是这样。仍然不起作用,但还是要感谢你的帮助:)@E-Nuff资源可能超出了范围,从树视图所在的位置看不到。如果可以访问定义样式的资源字典实例,则可以直接在字典对象中查找它。这将取决于你项目的细节。
TVVerlauf.SetBinding(TreeView.ItemContainerStyleProperty, "GoodTVI");
<TreeView
    ItemContainerStyle="{StaticResource GoodTVI}"
    ...other properties...
    >
TVVerlauf.ItemContainerStyle = (DataTemplate)TVVerlauf.FindResource("GoodTVI");