如何获取wpf datagrid中DatagridTemplateColumn的单元格内容?

How to get the cell content of DatagridTemplateColumn in wpf datagrid?

我有一个 DataGridTemplateColumn,其 header 基本上由包含按钮和 TextBlock 的 StackPanel 组成。我想在加载 datagridrow 时访问 Cell 内容或 DataGridCell。

我的数据网格列之一如下所示:

<DataGridTemplateColumn>
                <DataGridTemplateColumn.HeaderTemplate >
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"  Click="HeaderButtonClick">
                                <Button.Content>
                                    <Path Stretch="Fill" Fill="Black" Stroke="{x:Null}" StrokeThickness="0.5" 
                                          Data="M3.875,0 L5.125,0 5.125,3.875 9,3.875 9,5.125 5.125,5.125 5.125,9 3.875,9 3.875,5.125 0,5.125 0,3.875 3.875,3.875 3.875,0 z" />
                                </Button.Content>
                            </Button>
                            <TextBlock Text="Fund" Margin="20,0,0,0"/>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
        <TextBlock Text="{Binding Fund}" Margin="20,0,0,0"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>

并且 datagrid_loadingrow 事件看起来像

    var dg = sender as DataGrid;
    if (dg != null)
    {
        foreach (var item in dg.Columns)
        {
            DataGridCell cell1 = item.GetCellContent(row) as DataGridCell;
         }
    }

谁能帮我解决这个问题?

这是 WPF,不是 WindowsForms。使用 WPF 时,我们将数据绑定到 UI 控件属性,而不是尝试以编程方式设置这些值。数据绑定时,您已经可以访问代码 behind/view 模型中的数据,因此实际上没有必要尝试从 UI 控件访问它。

如果您查看 MSDN 上的 DataGridTemplateColumn Class 页面,您会看到这个示例:

<Grid>
    <Grid.Resources>
        <!--DataTemplate for Published Date column defined in Grid.Resources.  PublishDate is a property on the ItemsSource of type DateTime -->
        <DataTemplate x:Key="DateTemplate" >
            <StackPanel Width="20" Height="30">
                <Border Background="LightBlue" BorderBrush="Black" BorderThickness="1">
                    <TextBlock Text="{Binding PublishDate, StringFormat={}{0:MMM}}" FontSize="8" HorizontalAlignment="Center" />
                </Border>
                <Border Background="White" BorderBrush="Black" BorderThickness="1">
                    <TextBlock Text="{Binding PublishDate, StringFormat={}{0:yyyy}}" FontSize="8" FontWeight="Bold" HorizontalAlignment="Center" />
                </Border>
            </StackPanel>
        </DataTemplate>
        <!--DataTemplate for the Published Date column when in edit mode. -->
        <DataTemplate x:Key="EditingDateTemplate">
            <DatePicker SelectedDate="{Binding PublishDate}"  />
        </DataTemplate>
    </Grid.Resources>
    <DataGrid Name="DG1" ItemsSource="{Binding}" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <!--Custom column that shows the published date-->
            <DataGridTemplateColumn Header="Publish Date" CellTemplate="{StaticResource DateTemplate}" CellEditingTemplate="{StaticResource EditingDateTemplate}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

注意 Bindings... 例如,我们可以看到:

<DatePicker SelectedDate="{Binding PublishDate}"  />

这个值可以直接从数据绑定对象的 PublishDate 属性 访问,而不是从 DataGrid:

DateTime publishDate = DataBoundCollection.ElementAt(relevantRowIndex).PublishDate;

您可以从 MSDN 上的 Data Binding Overview 页面找到有关数据绑定的更多信息。

这里是 answer.How 您将使用 code.If 访问模板列内容 您想要访问任何类型的 Control 内容,例如 Button content ,TextBlock content etc.Then 你为那些 Controls 创建加载事件。然后去加载事件 code.In 加载事件,您将访问那些 ControlsContent。 我将访问 Stack PanelButton 子项。
所以请遵循此代码。
Xaml:

<DataGridTemplateColumn>
            <DataGridTemplateColumn.HeaderTemplate >
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Loaded="StackPanel_Loaded">
                        <Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"  Click="HeaderButtonClick">
                            <Button.Content>
                                <Path Stretch="Fill" Fill="Black" Stroke="{x:Null}" StrokeThickness="0.5" 
                                      Data="M3.875,0 L5.125,0 5.125,3.875 9,3.875 9,5.125 5.125,5.125 5.125,9 3.875,9 3.875,5.125 0,5.125 0,3.875 3.875,3.875 3.875,0 z" />
                            </Button.Content>
                        </Button>
                        <TextBlock Text="Fund" Margin="20,0,0,0"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.HeaderTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
    <TextBlock Text="{Binding Fund}" Margin="20,0,0,0"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>

代码隐藏 .cs

  private void StackPanel_Loaded(object sender, RoutedEventArgs e)
    {
        StackPanel stack = sender as StackPanel;
        Button button = stack.Children.OfType<Button>().FirstOrDefault();
        button.Content = "Change Content";

    }

在我的情况下,我想访问 模板列 中的按钮。我使用了这段代码 XAML

       <DataGridTemplateColumn x:Name="deleteDG" Header="Delete"  >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate x:Uid="deletetemp" >
                        <Button Click="deleteBtn_Click" Loaded="Button_Loaded"   Width="95" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Background="White" Content="Delete"/>

                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

代码隐藏 .cs

   private void Button_Loaded(object sender, RoutedEventArgs e)
    {
        Button button = sender as Button;
        button.Content = "Change COntent";
    }