在树视图中切换按钮样式不起作用
Posted
技术标签:
【中文标题】在树视图中切换按钮样式不起作用【英文标题】:ToggleButton style not working when in treeview 【发布时间】:2014-01-21 19:52:26 【问题描述】:我有一个带有桶和部件的树视图。除了一个功能外,一切看起来都很棒。存储桶上的属性 (bool IsEditable) 允许用户在该节点的树视图中打开或关闭编辑。但是由于某种原因,当 wpf 在树视图中显示存储桶的集合时,切换按钮不会显示正确的文本 这是我的 xaml:
<Style TargetType="x:Type ToggleButton" x:Key="Editor">
<Style.Triggers>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Content">
<Setter.Value>
<TextBlock Text="Edit"/>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content">
<Setter.Value>
<TextBlock Text="Done"/>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<DataTemplate x:Key="HierarchialItemTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Binding BucketQty, UpdateSourceTrigger=PropertyChanged"/>
<TextBlock Text=" "/>
<TextBlock Text="Binding PartNum"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="DisplayBucket">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Binding Sequence"/>
<TextBlock Text=" "/>
<TextBlock Text="Binding Description"/>
<ToggleButton IsChecked="Binding IsEditable" Width="25" Style="StaticResource Editor"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="EditBucket">
<StackPanel Orientation="Horizontal">
<TextBox Text="Binding Sequence"/>
<TextBlock Text=" "/>
<TextBox Text="Binding Description"/>
<ToggleButton IsChecked="Binding IsEditable" Width="25" Style="StaticResource Editor"/>
</StackPanel>
</DataTemplate>
<HierarchicalDataTemplate x:Key="TreeTemplate"
DataType="x:Type domain:Bucket"
ItemsSource="Binding Parts"
ItemTemplate="StaticResource HierarchialItemTemplate"
>
<ContentPresenter Content="Binding"
Style="DynamicResource TreeNodeStyle"/>
</HierarchicalDataTemplate>
<Style TargetType="x:Type ContentPresenter" x:Key="TreeNodeStyle">
<Setter Property="ContentTemplate" Value="StaticResource DisplayBucket"/>
<Style.Triggers>
<DataTrigger Binding="Binding IsEditable" Value="True">
<Setter Property="ContentTemplate" Value="StaticResource EditBucket"/>
</DataTrigger>
</Style.Triggers>
</Style>
以上是window.resources。在网格中是
<TreeView x:Name="Buckets"
ItemsSource="Binding Model.Job.Buckets"
ItemTemplate="StaticResource TreeTemplate"
>
因此,无论出于何种原因,当我添加节点时,我都会得到一个带有切换按钮的存储桶,但切换按钮文本只显示最后添加的节点。如果我单击一个切换按钮,文本会从上一个切换按钮中消失,并显示在刚刚单击的那个中。效果和这个人经历的差不多,但是我不知道那个回答问题的人在说什么ToggleButton Style only works on last ToggleButton。
有什么想法吗?
【问题讨论】:
【参考方案1】:您有几个选项(从最戏剧性到最戏剧性排序):
1) 内容
<Style TargetType="x:Type ToggleButton" x:Key="Editor">
<Style.Triggers>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Content" Value="Edit" />
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content" Value="Done" />
</Trigger>
</Style.Triggers>
</Style>
2) 内容模板
<Style TargetType="x:Type ToggleButton" x:Key="Editor">
<Style.Triggers>
<Trigger Property="IsChecked" Value="False">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="Edit"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="Done"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
3) 控制模板
<Style TargetType="x:Type ToggleButton" x:Key="Editor">
<Style.Triggers>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type ToggleButton">
<TextBlock Text="Edit"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type ToggleButton">
<TextBlock Text="Done"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
您的方法不起作用的原因是 TextBlock 控件仅创建一次(即未作为模板的一部分创建 - ControlTemplate
或 DataTemplate
)。
【讨论】:
以上是关于在树视图中切换按钮样式不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 EnvironmentObject(按钮和导航视图)切换视图不起作用