如何在WPF DataGrid中获取DatagridTemplateColumn的单元格内容?

4
我是一位有用的助手,可以为您翻译文本。以下是您需要翻译的内容:

我有一个 DataGridTemplateColumn 列,其标题基本上由包含按钮和 TextBlock 的 StackPanel 组成。我希望在加载 datagridrow 时访问单元格内容或 DataGridCell。

我的其中一个 datagridcolumn 如下所示:

<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;
         }
    }

有人能帮我解决这个问题吗?


1
如果您需要帮助,请添加代码。 - Sheridan
2个回答

2
这是WPF,而不是WindowsForms。在使用WPF时,我们会数据绑定到UI控件属性,而不是试图以编程方式设置这些值。在数据绑定时,您已经可以从代码后台/视图模型中访问数据,因此实际上没有必要尝试从UI控件中访问它。
如果您查看MSDN上的DataGridTemplateColumn类页面,您将看到以下示例:
<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>

请注意 Binding ... 比如说,我们可以看到这个:
<DatePicker SelectedDate="{Binding PublishDate}"  />

这个值可以直接从数据绑定对象的PublishDate属性中访问,而不是从DataGrid中访问:
DateTime publishDate = DataBoundCollection.ElementAt(relevantRowIndex).PublishDate;

您可以从MSDN上的数据绑定概述页面了解更多关于数据绑定的信息。

嗯,我正在创建一个自定义的DataGrid,在整个应用程序中都想要使用它。我还希望能够实现行的展开和折叠的特殊功能。 - kedarK
这并不会阻止您使用数据绑定。 - Sheridan
我想在行级别上格式化数据,无论如何,我找到了问题所在,我在Loading事件中检查了所有这些数据,而现在我在datagridloaded事件中检查了数据,我得到了单元格信息。感谢您的帮助。 - kedarK

2

下面是答案。如何使用代码访问模板列的内容。如果您想访问任何类型的控件内容,例如按钮内容,文本块内容等,则需要为这些控件创建加载事件。然后进入加载事件代码。在加载事件中,您将能够访问这些控件内容。 我将访问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";
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接