数据网格文本列单击编辑模式

时间:2013-10-08 17:06:41

标签: c# .net wpf xaml datagrid

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

2 个答案:

答案 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。然后你可以在文本框上使用焦点触发器(例如)在获得焦点时更改文本框的背景颜色和只读属性...