【问题标题】:How do I define columns for inner DataGrid in a custom control如何在自定义控件中为内部 DataGrid 定义列
【发布时间】:2015-07-09 08:01:35
【问题描述】:

我正在尝试实现一个新控件 (XGrid),其中包含一个 DataGrid。

大多数时候我直接通过 DependencyProperty 绑定数据并将 AutoGenerateColumns 设置为True

现在,在特定情况下,我需要手动配置 DataGrid 的列。 我想到了类似的东西:

<local:XGrid AutoGenerateColumns="False" DataContext="{Binding SourceList}">
    <local:XGrid.Columns>
        <DataGridTextColumn Header="T1" Binding="{Binding Path=.Value1}"/>
        <DataGridTextColumn Header="T2" Binding="{Binding Path=.Value2}"/>
        <DataGridTextColumn Header="T3" Binding="{Binding Path=.Value3}"/>
    </local:XGrid.Columns>        
</local:XGrid>

这或类似的事情可能吗?

--- 编辑 1 ---

XGrid 实际上并不是从 DataGrid 派生的

【问题讨论】:

    标签: c# wpf datagrid dependency-properties


    【解决方案1】:

    更改了我的最后一个答案,因为您的编辑改变了场景......

    在这种情况下,您可以公开列属性并将列设置到其中,然后在本地集合更改时在构造函数中将列添加到主数据网格。

    这样的东西应该可以工作..

    public static readonly DependencyProperty GridColumnsProperty = DependencyProperty.Register("GridColumns", typeof(ObservableCollection<DataGridColumn>), typeof(XGrid));
            public ObservableCollection<DataGridColumn> GridColumns
            {
                get { return (ObservableCollection<DataGridColumn>)GetValue(GridColumnsProperty); }
                set { SetValue(GridColumnsProperty, value); }
            }
    
    
    public XGrid()
    {
            GridColumns = new ObservableCollection<DataGridColumn>();
            GridColumns.CollectionChanged += (x, y) =>
                {
                    dataGrid.Columns.Clear();
                    foreach (var column in this.GridColumns)
                    {
                        dataGrid.Columns.Add(column);
                    }
                };
            InitializeComponent();
        }
    

    【讨论】:

    • 是的,这行得通,但现在当我第二次打开包含 XGrid 的模块时,我得到一个 ArgumentException,说:Additional information: The DataGridColumn with Header 'T1' already exists in the column collection of a DataGrid. Data Grids can not share columns and can not contain duplicate column instances.
    • 你有这个dataGrid.Columns.Clear();吗?
    • 是的,我有,当我关闭我的模块并再次打开它时,我通过记录构造函数中给出的 UID 来跟踪 XGrid 实例(打开意味着为每个 new Module();... 创建一个新实例@同一个实例XGrid的被使用了!它没有被丢弃或者类似的东西,它似乎被重用了?!
    • 是在像datatemplate这样的模板中吗?,你也可以调试检查哪一行抛出错误并且可以处理它没有?
    • 不,它不像模板,但我找到了错误的根源(我的错误......)。如您的代码中所述,我忘记设置 Columns_Center = new ObservableCollection&lt;DataGridColumn&gt;(); 。现在可以使用了,谢谢!
    猜你喜欢
    • 2012-05-24
    • 2012-02-19
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多