在WPF DataGrid单元格编辑期间显示弹出窗口

沃尔特·威廉姆斯

如何在我的DataGridTemplateColumn.CellEditingTemplate中正确放置一个弹出窗口相同,我试图在单元格被编辑时使PopUp出现在DataGrid的单元格下面,而当不再编辑该单元格时就消失。最后一件事是PopUp的内容根据列是动态的,并且这些列是通过绑定动态创建的。

我从以下XAML开始,但得到XamlParseException“向类型'System.Windows.Controls.ItemCollection'的集合添加值引发了异常”。

<DataGrid ItemsSource="{Binding Path=Options}">
    <DataGridTemplateColumn>
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <Grid>
                    <Popup Placement="Bottom" IsOpen="True" Width="200" Height="100">
                        <TextBlock>Somethingn here</TextBlock>
                    </Popup>
                </Grid>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>
</DataGrid>
沃尔特·威廉姆斯

我已经找到了目前为止行之有效的解决方案。它涉及一些事件处理程序,但是代码不必访问视图模型,因此希望它不会引起MVVM纯粹主义者的愤怒。

XAML:

<Grid>
    <DataGrid ItemsSource="{Binding Path=Options}" BeginningEdit="DataGrid_BeginningEdit" CellEditEnding="DataGrid_CellEditEnding" />
    <Popup Name="pop1">
        <Border Width="300" Height="200" Background="LemonChiffon" BorderThickness="2" BorderBrush="Black" />
    </Popup>
</Grid>

MainWindow.xaml.cs事件处理程序:

private void DataGrid_BeginningEdit (Object sender, DataGridBeginningEditEventArgs e)
{
    DataGrid grid = (DataGrid) sender;
    Popup pop1 = (Popup) grid.FindName("pop1");
    pop1.PlacementTarget = grid.GetCell(e.Row.GetIndex(), e.Column.DisplayIndex);
    pop1.IsOpen = true;
}

private void DataGrid_CellEditEnding (Object sender, DataGridCellEditEndingEventArgs e)
{
    Popup pop1 = (Popup) ((DataGrid) sender).FindName("pop1");
    pop1.IsOpen = false;
}

DataGridExtensions.cs:

/// <summary>
/// Extension methods for DataGrid
/// These methods are thanks to http://blogs.msdn.com/b/vinsibal/archive/2008/11/05/wpf-datagrid-new-item-template-sample.aspx
/// </summary>
public static class DataGridExtensions
{
    /// <summary>
    /// Returns a DataGridCell for the given row and column
    /// </summary>
    /// <param name="grid">The DataGrid</param>
    /// <param name="row">The zero-based row index</param>
    /// <param name="column">The zero-based column index</param>
    /// <returns>The requested DataGridCell, or null if the indices are out of range</returns>
    public static DataGridCell GetCell (this DataGrid grid, Int32 row, Int32 column)
    {
        DataGridRow gridrow = grid.GetRow(row);
        if (gridrow != null)
        {
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(gridrow);

            // try to get the cell but it may possibly be virtualized
            DataGridCell cell = (DataGridCell) presenter.ItemContainerGenerator.ContainerFromIndex(column);
            if (cell == null)
            {
                // now try to bring into view and retreive the cell
                grid.ScrollIntoView(gridrow, grid.Columns[column]);

                cell = (DataGridCell) presenter.ItemContainerGenerator.ContainerFromIndex(column);
            }

            return (cell);
        }

        return (null);
    }

    /// <summary>
    /// Gets the DataGridRow based on the given index
    /// </summary>
    /// <param name="idx">The zero-based index of the container to get</param>
    public static DataGridRow GetRow (this DataGrid dataGrid, Int32 idx)
    {
        DataGridRow row = (DataGridRow) dataGrid.ItemContainerGenerator.ContainerFromIndex(idx);
        if (row == null)
        {
            // may be virtualized, bring into view and try again
            dataGrid.ScrollIntoView(dataGrid.Items[idx]);
            dataGrid.UpdateLayout();

            row = (DataGridRow) dataGrid.ItemContainerGenerator.ContainerFromIndex(idx);
        }

        return (row);
    }

    private static T GetVisualChild<T> (Visual parent) where T : Visual
    {
        T child = default(T);

        Int32 numvisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (Int32 i = 0; i < numvisuals; ++i)
        {
            Visual v = (Visual) VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
                child = GetVisualChild<T>(v);
            else
                break;
        }

        return child;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果切换所选行,WPF DataGrid将不显示单元格编辑

来自分类Dev

WPF DataGrid单元格不退出编辑模式

来自分类Dev

WPF C#DataGrid编辑单元格

来自分类Dev

WPF Datagrid单元格按钮图像未显示

来自分类Dev

WPF DataGrid 动态宽度单元格高亮显示

来自分类Dev

在WPF中将DataGrid所选行的所有单元格置于“编辑”模式

来自分类Dev

WPF DataGrid-编辑结束后单元格的新值

来自分类Dev

WPF Datagrid的可编辑单元格在删除旧值并留空后被禁用,然后跳出

来自分类Dev

在WPF中将DataGrid所选行的所有单元格置于“编辑”模式

来自分类Dev

WPF DataGrid可编辑单元格,将Items定向放置

来自分类Dev

WPF Datagrid的可编辑单元格在删除旧值并留空然后跳出后被禁用

来自分类Dev

如何在DataGrid控件wpf中编辑单元格类型?

来自分类Dev

wpf DataGrid禁用除第一列外的特定行的单元格编辑

来自分类Dev

WPF DataGrid 突出显示与所选单元格匹配的列中的所有单元格

来自分类Dev

WPF DataGrid SelectedRow 仅突出显示数据单元格中的文本

来自分类Dev

设置DataGrid单元格背景色WPF

来自分类Dev

WPF DataGrid单元格值更改事件

来自分类Dev

WPF DataGrid的结构-根据值更改单元格

来自分类Dev

WPF DataGrid触发单元格内容

来自分类Dev

从datagrid WPF中的单元格中移出焦点

来自分类Dev

WPF DataGrid,在单元格中转换值

来自分类Dev

WPF Datagrid获取选定的单元格值

来自分类Dev

WPF DataGrid:设置单个单元格的样式

来自分类Dev

WPF DataGrid绑定后如何修改单元格

来自分类Dev

Wpf DataGrid仅在单击单元格时更新

来自分类Dev

在WPF Datagrid中更改单个单元格的颜色

来自分类Dev

Datagrid 单元格内容在 WPF 中不可见

来自分类Dev

如何更改 WPF 中的 DataGrid 单元格悬停颜色?

来自分类Dev

如果单元格包含特定值,则WPF DataGrid更改单元格背景

Related 相关文章

  1. 1

    如果切换所选行,WPF DataGrid将不显示单元格编辑

  2. 2

    WPF DataGrid单元格不退出编辑模式

  3. 3

    WPF C#DataGrid编辑单元格

  4. 4

    WPF Datagrid单元格按钮图像未显示

  5. 5

    WPF DataGrid 动态宽度单元格高亮显示

  6. 6

    在WPF中将DataGrid所选行的所有单元格置于“编辑”模式

  7. 7

    WPF DataGrid-编辑结束后单元格的新值

  8. 8

    WPF Datagrid的可编辑单元格在删除旧值并留空后被禁用,然后跳出

  9. 9

    在WPF中将DataGrid所选行的所有单元格置于“编辑”模式

  10. 10

    WPF DataGrid可编辑单元格,将Items定向放置

  11. 11

    WPF Datagrid的可编辑单元格在删除旧值并留空然后跳出后被禁用

  12. 12

    如何在DataGrid控件wpf中编辑单元格类型?

  13. 13

    wpf DataGrid禁用除第一列外的特定行的单元格编辑

  14. 14

    WPF DataGrid 突出显示与所选单元格匹配的列中的所有单元格

  15. 15

    WPF DataGrid SelectedRow 仅突出显示数据单元格中的文本

  16. 16

    设置DataGrid单元格背景色WPF

  17. 17

    WPF DataGrid单元格值更改事件

  18. 18

    WPF DataGrid的结构-根据值更改单元格

  19. 19

    WPF DataGrid触发单元格内容

  20. 20

    从datagrid WPF中的单元格中移出焦点

  21. 21

    WPF DataGrid,在单元格中转换值

  22. 22

    WPF Datagrid获取选定的单元格值

  23. 23

    WPF DataGrid:设置单个单元格的样式

  24. 24

    WPF DataGrid绑定后如何修改单元格

  25. 25

    Wpf DataGrid仅在单击单元格时更新

  26. 26

    在WPF Datagrid中更改单个单元格的颜色

  27. 27

    Datagrid 单元格内容在 WPF 中不可见

  28. 28

    如何更改 WPF 中的 DataGrid 单元格悬停颜色?

  29. 29

    如果单元格包含特定值,则WPF DataGrid更改单元格背景

热门标签

归档