2

我有一个用 WPF Toolkit 定义的 DataGrid。此 DataGrid 的 CellEditingTemplate 在运行时与构建 FrameworkElementFactory 元素的自定义函数相关联。

现在我必须访问插入到 CellEditingTempleta 的 DataTemplate 中的控件,但我不知道该怎么做。

在网上我发现了一个有用的 ListView Helper...

public static class ListViewHelper
{
    public static FrameworkElement GetElementFromCellTemplate(ListView listView, Int32 column, Int32 row, String name)
    {
        if (row >= listView.Items.Count || row < 0)
        {
            throw new ArgumentOutOfRangeException("row");
        }

        GridView gridView = listView.View as GridView;
        if (gridView == null)
        {
            return null;
        }

        if (column >= gridView.Columns.Count || column < 0)
        {
            throw new ArgumentOutOfRangeException("column");
        }

        ListViewItem item = listView.ItemContainerGenerator.ContainerFromItem(listView.Items[row]) as ListViewItem;
        if (item != null)
        {
            GridViewRowPresenter rowPresenter = GetFrameworkElementByName<GridViewRowPresenter>(item);
            if (rowPresenter != null)
            {
                ContentPresenter templatedParent = VisualTreeHelper.GetChild(rowPresenter, column) as ContentPresenter;
                DataTemplate dataTemplate = gridView.Columns[column].CellTemplate;
                if (dataTemplate != null && templatedParent != null)
                {
                    return dataTemplate.FindName(name, templatedParent) as FrameworkElement;
                }
            }
        }

        return null;
    }

    private static T GetFrameworkElementByName<T>(FrameworkElement referenceElement) where T : FrameworkElement
    {
        FrameworkElement child = null;
        for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceElement); i++)
        {
            child = VisualTreeHelper.GetChild(referenceElement, i) as FrameworkElement;
            System.Diagnostics.Debug.WriteLine(child);
            if (child != null && child.GetType() == typeof(T))
            {
                break;
            }
            else if (child != null)
            {
                child = GetFrameworkElementByName<T>(child);
                if (child != null && child.GetType() == typeof(T))
                {
                    break;
                }
            }
        }
        return child as T;
    }
}

此代码适用于 ListView 对象,但不适用于 DataGrid 对象。

如何在 DataGrid 中使用这样的东西?

4

2 回答 2

0

好吧,但是我用这段代码创建了一个 DataTemplate ......

var txtStandard = new FrameworkElementFactory(typeof(TextBox)); txtStandard.SetBinding(TextBox.TextProperty, new Binding("Entity")); new DataTemplate { VisualTree = txtStandard };

我需要像控制对象一样管理 txtStandard;如何将 FrameworkElementFactory 转换为 Control?

于 2009-11-04T09:12:50.873 回答
0

新想法: 不要在 DataTemplate 中创建文本对象,而是创建您创建的自定义控件的实例。然后将文本对象放入自定义控件中,并将管理它所需的所有代码放入自定义控件中。

老想法: 您将需要通过 DataGrid 的 VisualTree 进行递归。我建议您在运行时使用Snoop之类的程序监视您的应用程序,然后编辑您提供的示例代码以沿着正确的路径到达您感兴趣的控件。

请记住,这很难,因为它不是常见的工作流程。您可能应该在 DataTemplate 中创建绑定。

于 2009-11-04T09:01:21.317 回答