C# 如何为FrameworkElementFactory(typeof(Datagrid))生成自定义列?
我有DataGrid,它必须在RowDetails中包含childGrid,但我不知道如何为子网格创建列。 目前,我有一个子网格,其中包含我不需要的自动生成列:C# 如何为FrameworkElementFactory(typeof(Datagrid))生成自定义列?,c#,wpf,datagrid,C#,Wpf,Datagrid,我有DataGrid,它必须在RowDetails中包含childGrid,但我不知道如何为子网格创建列。 目前,我有一个子网格,其中包含我不需要的自动生成列: private static bool CopyWork(TextBox textBox) { try { var match = Regex.Match(textBox.Text, @"^коп раб"); if (match.Success) {
private static bool CopyWork(TextBox textBox)
{
try
{
var match = Regex.Match(textBox.Text, @"^коп раб");
if (match.Success)
{
var copyWorkWindow = new Window()
{
Topmost = true,
WindowStartupLocation = WindowStartupLocation.CenterScreen,
Title = "Копирование документов",
SizeToContent = SizeToContent.WidthAndHeight
};
var documents = new ObservableCollection<CopyWorkDocument>();
var dataGrid = new DataGrid()
{
ItemsSource = documents,
AutoGenerateColumns = false
};
var generateColumn = new Func<string, string, object[], FrameworkElementFactory>((header, bindingItem, items) =>
{
var column = new FrameworkElementFactory(typeof(DataGridTemplateColumn));
column.SetValue(DataGridTemplateColumn.HeaderProperty, header);
var binding1 = new Binding(bindingItem)
{
Mode = BindingMode.TwoWay
};
var elementTextBlock = new FrameworkElementFactory(typeof(TextBlock));
elementTextBlock.SetValue(TextBlock.TextProperty, binding1);
var cellTemplate = new DataTemplate
{
VisualTree = elementTextBlock
};
column.SetValue(DataGridTemplateColumn.CellTemplateProperty, cellTemplate);
if (items != null)
{
var elementComboBox = new FrameworkElementFactory(typeof(ComboBox));
elementComboBox.SetValue(ComboBox.BackgroundProperty, Brushes.White);
elementComboBox.SetValue(ComboBox.ItemsSourceProperty, items);
elementComboBox.SetValue(ComboBox.SelectedItemProperty, binding1);
var cellEditingTemplate = new DataTemplate
{
VisualTree = elementComboBox
};
column.SetValue(DataGridTemplateColumn.CellEditingTemplateProperty, cellEditingTemplate);
}
return column;
});
dataGrid.Columns.Add(new DataGridTextColumn() { Header = "Название документа", Binding = new Binding("Name") });
dataGrid.Columns.Add(new DataGridTextColumn() { Header = "Количество копий", Binding = new Binding("Documentcount") });
var rowDetailsTemplate = new DataTemplate();
var pagesGrid = new FrameworkElementFactory(typeof(DataGrid));
//pagesGrid.SetValue(DataGrid.AutoGenerateColumnsProperty, false);
pagesGrid.SetValue(DataGrid.ItemsSourceProperty, new Binding("Pages"));
rowDetailsTemplate.VisualTree = pagesGrid;
dataGrid.RowDetailsTemplate = rowDetailsTemplate;
copyWorkWindow.Content = dataGrid;
copyWorkWindow.ShowDialog();
var sB = new StringBuilder();
foreach (var document in documents)
{
sB.Append(document).Append(Environment.NewLine);
}
if (sB.Length > 0)
{
textBox.Text = sB.ToString();
}
}
return match.Success;
}
catch (Exception ex)
{
ex.LogAndShow();
return false;
}
}
首先,我为DataGrid Conrol创建了这个生成器,但随后我为FrameworkElementFactory重新编写了它。正如MSDN上所述,由于StackOverflow CodeLimition post添加了这个无用的详细信息,使用FrameworkElementFactory类以编程方式创建模板是一种不推荐的方法: 您可以改用System.Windows.Markup.XamlReader.Parse方法:
StringBuilder sb = new StringBuilder();
sb.Append("<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x =\"http://schemas.microsoft.com/winfx/2006/xaml\">");
sb.Append("<DataGrid ItemsSource=\"{Binding Pages}\" AutoGenerateColumns=\"False\">");
sb.Append("<DataGrid.Columns>");
//append for each column:
sb.Append("<DataGridTextColumn Binding=\"{Binding Name}\" Header=\"Name\" />");
sb.Append("</DataGrid.Columns>");
sb.Append("</DataGrid>");
sb.Append("</DataTemplate>");
dataGrid.RowDetailsTemplate = XamlReader.Parse(sb.ToString()) as DataTemplate;
DataGrid.Columns.Add(generateColumn("ColumnName", "ColumnBinding", "ColumnItemsHelper"[]));
StringBuilder sb = new StringBuilder();
sb.Append("<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x =\"http://schemas.microsoft.com/winfx/2006/xaml\">");
sb.Append("<DataGrid ItemsSource=\"{Binding Pages}\" AutoGenerateColumns=\"False\">");
sb.Append("<DataGrid.Columns>");
//append for each column:
sb.Append("<DataGridTextColumn Binding=\"{Binding Name}\" Header=\"Name\" />");
sb.Append("</DataGrid.Columns>");
sb.Append("</DataGrid>");
sb.Append("</DataTemplate>");
dataGrid.RowDetailsTemplate = XamlReader.Parse(sb.ToString()) as DataTemplate;