DataGridRowDetails - 切换问题

时间:2017-02-06 08:56:04

标签: c# wpf xaml datagrid

我有DataGrid包含一些工作。 每项工作的内容都显示在RowDetails

我遇到了多个问题:

问题:为什么Image上的ToggleButton仅显示在Selected和最后一行?

这是我的xaml

<DataGridTemplateColumn>
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <ToggleButton IsChecked="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=DetailsVisibility, Converter={StaticResource BoolToVisConverter}, Mode=TwoWay}">                                   
        <ToggleButton.Style>
          <Style TargetType="ToggleButton">
            <Style.Triggers>
              <Trigger Property="IsChecked" Value="True">
                <Setter Property="Content">
                  <Setter.Value>
                    <Image Source="..\Resources\ic_expand_less_48px.png" Height="16" Width="16" />
                  </Setter.Value>
                </Setter>
              </Trigger>
              <Trigger Property="IsChecked" Value="{x:Null}">
                <Setter Property="Content">
                  <Setter.Value>
                    <Image Source="..\Resources\ic_expand_more_48px.png" Height="16" Width="16" />
                  </Setter.Value>
                </Setter>
               </Trigger>
               <Trigger Property="IsChecked" Value="False">
                 <Setter Property="Content">
                   <Setter.Value>
                     <Image Source="..\Resources\ic_expand_more_48px.png" Height="16" Width="16" />
                   </Setter.Value>
                 </Setter>
               </Trigger>
             </Style.Triggers>
           </Style>
         </ToggleButton.Style>
       </ToggleButton>
     </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
 </DataGridTemplateColumn>

1 个答案:

答案 0 :(得分:1)

当Style使用UIElement for Content属性(在本例中为Image)时,它会创建该元素的单个实例。当Style应用于多个控件时,其中只有一个显示Content,因为UIElement不能有多个父级。

这就是为什么在大多数情况下使用自定义模板的原因。 ToggleButton具有ContentTemplate属性来自定义内容部分的外观:(其他两个触发器的代码相同)

<Trigger Property="IsChecked" Value="False">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Image Source="..\Resources\ic_expand_more_48px.png" Height="16" Width="16" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Trigger>

我知道另一种使用非共享资源的方法:

<Image x:Key="ExpandMoreImg" x:Shared="False"
       Source="..\Resources\ic_expand_more_48px.png" Height="16" Width="16" />

<Trigger Property="IsChecked" Value="False">
    <Setter Property="Content" Value="{StaticResource ExpandMoreImg}"/>
</Trigger>

Shared设置为false,每次使用都会有一个Image实例