首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为FrameworkElementFactory(类型(数据))生成自定义列?

如何为FrameworkElementFactory(类型(数据))生成自定义列?
EN

Stack Overflow用户
提问于 2017-10-02 09:12:33
回答 1查看 426关注 0票数 0

我有DataGrid,它必须在RowDetails中有childGrid,但是我不知道如何为子网格创建列。

目前,我有一个带有自动生成列的子网格,我不需要:

代码语言:javascript
复制
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;
    }
}  

下面是columnGenerator。

对象类:

代码语言:javascript
复制
private class CopyWorkDocument
{
    public string Name { get; set; }
    public int Documentcount { get; set; } = 1;
    public List<CopyPage> Pages { get; set; } = new List<CopyPage> { new CopyPage() };

    public override string ToString()
    {
        var sB = new StringBuilder().Append(Name);
        foreach (var page in Pages)
        {
            sB.Append(Environment.NewLine).Append(Documentcount).Append("шт (").Append(page).Append(")");
        }
        return sB.ToString();
    }

    public class CopyPage
    {
        public int Pagecount { get; set; } = 1;
        public string Pageformat { get; set; } = "A4";
        public string Worktype { get; set; } = "печать";
        public string Printtype { get; set; } = "односторонняя";
        public bool IsColored { get; set; } = false;

        public static string[] Worktypes { get => new string[] { "печать", "копирование", "сканирование", "брошюровка", "твердый переплет" }; }
        public static string[] Printtypes { get => new string[] { "односторонняя", "двусторонняя" }; }
        public static string[] Formats { get => new string[] { "A4", "A3", "A2", "A1" }; }

        public override string ToString()
        {
            var sB = new StringBuilder().Append(Pagecount).Append(" ").Append(Pageformat);
            if (IsColored)
            {
                sB.Append(" цвет");
            }
            return sB.ToString();
        }
    }
}  

colum生成器示例:

代码语言:javascript
复制
DataGrid.Columns.Add(generateColumn("ColumnName", "ColumnBinding", "ColumnItemsHelper"[]));

首先,我为DataGrid (Conrol)做了这个生成器,但后来我为FrameworkElementFactory (由于StackOverflow代码划界后添加了这个无用的细节)重新工作了它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-02 10:14:50

正如MSDN上所述,使用FrameworkElementFactory类是以编程方式创建模板的一种不推荐的方法:https://msdn.microsoft.com/en-us/library/system.windows.frameworkelementfactory(v=vs.110).aspx

您可以使用System.Windows.Markup.XamlReader.Parse方法来代替:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46522636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档