我有一个使用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中使用这样的东西?
答案 0 :(得分:0)
新主意: 而不是在DataTemplate中创建文本对象,而是创建您创建的自定义控件的实例。然后将文本对象放在自定义控件中,并将所需的所有代码放在自定义控件中。
旧主意: 您需要通过DataGrid的VisualTree进行递归。我建议您在运行时使用Snoop等程序监视您的应用程序,然后编辑您提供的示例代码,沿着正确的路径前往您感兴趣的控件。
请记住,这很难,因为它不是常见的工作流程。您可能应该在DataTemplate中创建绑定。
答案 1 :(得分:0)
好吧,但我用这段代码创建了一个DataTemplate ......
var txtStandard = new FrameworkElementFactory(typeof(TextBox)); txtStandard.SetBinding(TextBox.TextProperty, new Binding("Entity")); new DataTemplate { VisualTree = txtStandard };
我需要像控件对象那样管理txtStandard;如何将FrameworkElementFactory强制转换为Control?