我在XAML中有一个DataGrid,其中每列都是一个文本列。我为每列定义了一个列模板。我希望能够在单元格上单击一次并处于编辑模式,而不必双击它。我跟着这个:http://wpf.codeplex.com/wikipage?title=Single-Click%20Editing我没有取得任何成功。现在,下面显示的示例代码只会在单击时将单元格置于焦点,它实际上不会让我进入编辑模式。任何帮助将不胜感激!
这是数据网格:
<DataGrid
DockPanel.Dock="Bottom"
x:Name="grdData"
FontFamily="Verdana"
Height="200"
AutoGenerateColumns="False"
RowHeight="22"
CanUserAddRows="True"
CanUserDeleteRows="True"
CanUserReorderColumns="False"
CanUserResizeColumns="True"
CanUserResizeRows="True"
CanUserSortColumns="True"
ItemsSource="{Binding GridData}"
SelectionUnit="CellOrRowHeader"
SelectionMode="Extended">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<EventSetter
Event="PreviewMouseLeftButtonDown"
Handler="DataGridCell_PreviewMouseLeftButtonDown"/>
</Style>
</DataGrid.Resources>
以下是我定义的示例列模板:
<DataGridTemplateColumn Width="60">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock
Style="{StaticResource tbkStyleGridHeader}"
TextWrapping="Wrap"
Text="GelPak Location"/>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Style="{StaticResource tbkStyleGridCell}"
TextWrapping="Wrap"
Text="{Binding GelPakLocation}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox
Text="{Binding GelPakLocation, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
以下是代码隐藏:
private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DataGridCell cell = (DataGridCell) sender;
if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
{
if (!cell.IsFocused)
{
cell.Focus();
}
DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
if (dataGrid != null)
{
if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
{
if (!cell.IsSelected)
{
cell.IsSelected = true;
cell.IsEditing = true;
}
}
else
{
DataGridRow row = FindVisualParent<DataGridRow>(cell);
if (row != null && !row.IsSelected)
{
row.IsSelected = true;
}
}
}
}
}
static T FindVisualParent<T>(UIElement element) where T : UIElement
{
UIElement parent = element;
while (parent != null)
{
T correctlyTyped = parent as T;
if (correctlyTyped != null)
{
return correctlyTyped;
}
parent = VisualTreeHelper.GetParent(parent) as UIElement;
}
return null;
}
答案 0 :(得分:3)
我解决了它:
遵循本教程:http://wpf.codeplex.com/wikipage?title=Single-Click%20Editing
我刚刚将DataGridTemplateColumns更改为DataGridTextBoxColumns。在这样做时,我不得不摆脱CellTemplate和CellEditingTemplate元素。
现在我的列模板如下所示:
<DataGridTextColumn
Width="60"
Binding="{Binding GelPakLocation}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock
Style="{StaticResource tbkStyleGridHeader}"
TextWrapping="Wrap"
Text="GelPak Location"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
这样做也允许我在PreviewMouseLeftButtonDown事件处理程序中删除这一行:
cell.IsEditing = true;
似乎这条线并没有真正做任何事情。
答案 1 :(得分:0)
我建议您在实际的CellTemplate中使用TextBox并一起删除CellEditingTemplate。然后你可以在文本框上使用焦点触发器(例如)在获得焦点时更改文本框的背景颜色和只读属性...