【发布时间】:2014-07-13 15:47:29
【问题描述】:
我有一个包含一些列的 DataGrid。其中之一是模板列。该 TemplateColumn 声明如下:
<DataGridTemplateColumn Header="First Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding FirstName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding FirstName}" Loaded="TextBox_Loaded_1"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
要求:
以通用方式获取位于 CellTemplate 内的 TextBlock 内的文本。
我尝试过的:
当我在 TemplateColumn 的单元格上按 Enter 时,我想要 TextBlock 中的文本。所以,我使用了 DataGrid 的 PreviewKeyDown 事件如下:
private void DataGrid_PreviewKeyDown(.............)
{
If(e.Key == Key.Enter)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;
if(dep != null && dep is DataGridCell)
{
var CellTemplate = ((DataGridCell)dep).Content; //gives me ContentPresenter instead of Textblock
if (CellTemplate is TextBlock)
{
if (((TextBlock)CellTemplate).Text.Trim() == "")
{
//Do whatever I want
}
}
}
}
}
上述代码返回一个 ContentPresenter 而不是 TextBlock。为什么会这样?
另外,ContentPresenter 的内容为空。
【问题讨论】:
-
您已经绑定到 FirstName,为什么不访问 DataContext 并只使用 FirstName 属性?
-
@d.moncada 因停电,回复晚了。只要我在单元格中输入一些数据并按回车,我就想要它的值。当时 FirstName 属性为空,所以我不能使用它。
-
@Sajeetharan 抱歉,由于电力故障,回复晚了。我访问了您建议的页面。那里的回答者使用了 FindChild 方法,该方法需要 name 参数,但我正在开发类似可重用控件的东西,因此将使用此控件的开发人员可能不会提供名称,或者我可能无法猜测控件的名称。所以,我想要一个通用的方法。
-
同样在我在问题中提供的上述代码中,在这一行中给了我 ContentPresenter 而不是 Textblock:
var CellTemplate = ((DataGridCell)dep).Content;