C# 如何在自定义控件中为内部DataGrid定义列
我正在尝试实现一个新控件(XGrid),它包含一个DataGrid 大多数时候,我通过DependencyProperty直接绑定数据,并将AutoGenerateColumns设置为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>
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();
。它现在可以工作了,谢谢!