在树视图中,ToggleButton样式不起作用

时间:2014-01-21 19:52:27

标签: c# wpf xaml treeview

我有一个带有水桶和零件的树视图。除了一个功能外,一切看起来都很棒存储桶上的属性(bool IsEditable)允许用户在该节点的树视图中打开或关闭编辑。但由于某种原因,当wpf在树视图中显示桶的集合时,togglebuttons不会显示正确的文本 这是我的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。在Grid中

            <TreeView x:Name="Buckets"
                  ItemsSource="{Binding Model.Job.Buckets}"
                  ItemTemplate="{StaticResource TreeTemplate}"
                  >

因此,无论出于何种原因,当我添加节点时,我会得到一个带有切换按钮的存储桶,但切换按钮文本仅显示添加的最后一个节点。如果单击切换按钮,文本将从之前的切换按钮中消失,并显示在刚刚单击的按钮中。效果类似于这个人的经历,但我不知道那个人在谈论谁回答了问题ToggleButton Style only works on last ToggleButton

有什么想法吗?

1 个答案:

答案 0 :(得分: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)ContentTemplate

<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)ControlTemplate

<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)。