C# 如何在自定义控件中为内部DataGrid定义列

C# 如何在自定义控件中为内部DataGrid定义列,c#,wpf,datagrid,dependency-properties,C#,Wpf,Datagrid,Dependency Properties,我正在尝试实现一个新控件(XGrid),它包含一个DataGrid 大多数时候,我通过DependencyProperty直接绑定数据,并将AutoGenerateColumns设置为True 现在,在特定情况下,我需要手动配置DataGrid的列。 我想到了这样的事情: <local:XGrid AutoGenerateColumns="False" DataContext="{Binding SourceList}"> <local:XGrid.Columns>

我正在尝试实现一个新控件(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派生的,因为您的编辑更改了场景,所以更改了我的上一个答案

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

像这样的东西应该有用

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();
    }
public static readonly dependencProperty GridColumnsProperty=dependencProperty.Register(“GridColumns”、typeof(observedcollection)、typeof(XGrid));
公共可观测集合网格列
{
get{return(ObservableCollection)GetValue(GridColumnsProperty);}
set{SetValue(GridColumnsProperty,value);}
}
公共XGrid()
{
GridColumns=新的ObservableCollection();
GridColumns.CollectionChanged+=(x,y)=>
{
dataGrid.Columns.Clear();
foreach(this.GridColumns中的var列)
{
dataGrid.Columns.Add(column);
}
};
初始化组件();
}

是的,这是可行的,但是现在当我第二次打开包含XGrid的模块时,我得到了一个
ArgumentException
,它说:
其他信息:DataGrid的列集合中已经存在标题为“T1”的DataGridColumn。数据网格不能共享列,也不能包含重复的列实例。
您有这个
dataGrid.columns.Clear()吗就位?是的,我通过记录构造函数中给定的UID来跟踪XGrid实例,当我关闭模块并再次打开它时(打开意味着根据
new module()创建一个新实例)…
使用的是同一个XGrid实例!它没有被处理或类似的东西,似乎被重用了?!这是在像datatemplate这样的模板中吗?你也可以调试以检查哪一行抛出错误,并且可以处理它,没有?不,它不像模板,但我已经找到了错误的来源(我的坏…)。我忘了设置代码中提到的
Columns\u Center=new observeablecollection();
。它现在可以工作了,谢谢!