Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为FrameworkElementFactory(typeof(Datagrid))生成自定义列?_C#_Wpf_Datagrid - Fatal编程技术网

C# 如何为FrameworkElementFactory(typeof(Datagrid))生成自定义列?

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) {

我有DataGrid,它必须在RowDetails中包含childGrid,但我不知道如何为子网格创建列。 目前,我有一个子网格,其中包含我不需要的自动生成列:

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;