WPF Datagrid RowHeader切换所选行的按钮

时间:2013-09-26 14:40:33

标签: c# wpf datagrid

我有一个WPF应用程序,其中包含一个显示订单列表的数据网格。每个订单都有一个ID,但它可能有超过1个ID(由于某种原因我无法控制)。

所以我使用rowdetails在嵌套的数据网格中显示ID列表。

我希望实现两件事。

1)如果用户点击一行,它会自动展开并显示行详细信息&除非你点击另一行,否则无法折叠它。所以我想在rowheader中有一个按钮来搜索行详细信息的可见性,这样如果用户点击该行,则不会显示行详细信息。我只希望行详细信息显示是否单击了行标题中的按钮。

2)不是那么重要但如果它很容易实现,那么只有行ID超过1的行在行标题中才有一个按钮。

这是我的数据网格代码

<!-- The data grid to display orders-->
        <DataGrid DataContext="{Binding OrderBlock}" x:Name="dataGridOrders" 
                          ItemsSource="{Binding Orders}"
                          Style="{StaticResource DataGridTemplate}"
                          ColumnHeaderStyle="{StaticResource DG_ColumnHeader}"                      
                  RowHeaderStyle="{StaticResource DG_RowHeader}"
                  RowStyle="{StaticResource DG_Row}"
                  CellStyle="{StaticResource DG_Cell}"                      
                  RowDetailsTemplate="{StaticResource DG_RowDetail}"                      
                  AutoGenerateColumns="False"
                  HorizontalAlignment="Stretch" 
                  VerticalAlignment="Stretch"
                  Background="Silver"
                  RowHeaderWidth="30"                      
                  Margin="25,5,20,15">                                                     
            <DataGrid.RowHeaderTemplate>
                <DataTemplate>
                    <ToggleButton x:Name="RowHeaderToggleButton"
                                  Cursor="Hand"/>
                </DataTemplate>
            </DataGrid.RowHeaderTemplate>

在我的App.xaml中我做了样式,我有这个,

   <!-- Data Grid row header template -->
    <Style x:Key="DG_RowHeader" TargetType="{x:Type DataGridRowHeader}">
        <Setter Property="Width" Value="35"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                    <Border x:Name="DGRH_Border"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            SnapsToDevicePixels="True">
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                                <GradientStop Offset="0" Color="LightGray"/>
                                <GradientStop Offset="1" Color="WhiteSmoke"/>
                            </LinearGradientBrush>
                        </Border.Background>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>



    <!-- Toogle Button -->
    <Style TargetType="ToggleButton">
        <Setter Property="Padding" Value="3" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Grid>

                        <ContentPresenter x:Name="contentPresenter"
                                      Margin="{TemplateBinding Padding}"
                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                      Content="{TemplateBinding Content}"
                                      ContentTemplate="{TemplateBinding ContentTemplate}" />
                        <Path x:Name="DefaultPath"
                          VerticalAlignment="Top"
                          Data="M0,0 14,7 0,14 Z"
                          Fill="Gray"
                          Stretch="Fill" />
                        <Path x:Name="CheckedPath"
                          VerticalAlignment="Top"
                          Data="M0,0 14,0 7,14 Z"
                          Fill="LightGray"
                          Stretch="Fill"
                          Visibility="Collapsed" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

1 个答案:

答案 0 :(得分:0)

创建样式,然后设置DataGrids行标题样式

RowHeaderStyle="{DynamicResource SelectionRowHeaderStyle}"

请参阅此帖,其中显示了如何添加文本切换按钮: WPF Datagrid add button to datarowheader

这个展示了如何创建一个可以在这里应用的图像切换: ToggleButton changing image depending on state