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

时间:2015-05-20 12:41:58

标签: c# wpf wpf-controls wpfdatagrid

我有一个DataGridTemplateColumn,其标题基本上由StackPanel组成,它包含一个Button和TextBlock。我想在加载datagridrow时访问Cell内容或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;
         }
    }

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:2)

以下是答案。如何使用代码访问模板列内容。如果您想访问任何类型的控制内容,例如按钮内容, TextBlock < / strong> content etc.然后为那些控件创建加载事件。然后转到加载事件代码。在加载事件中,您将访问那些控件的内容 即可。 我将访问 Stack Panel Button 子项。
请遵循此代码。
的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";
    }

答案 1 :(得分:1)

这是WPF,而不是WindowsForms。使用WPF时,我们将数据绑定到UI控件属性,而不是尝试以编程方式设置这些值。在数据绑定时,您已经可以访问代码隐藏/视图模型中的数据,因此实际上无需尝试从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>

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

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

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

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

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