在树视图中切换按钮样式不起作用

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 控件仅创建一次(即未作为模板的一部分创建 - ControlTemplateDataTemplate)。

【讨论】:

以上是关于在树视图中切换按钮样式不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 EnvironmentObject(按钮和导航视图)切换视图不起作用

为啥segues不起作用?无法切换视图

UIImagePickerController:切换源类型不起作用

为啥这个切换按钮在颤振 - 飞镖中不起作用?

带有工具栏的菜单中的单选按钮样式不起作用

向AppTheme添加按钮样式不起作用