다음과 같은 코드 한 줄을 사용하여 열을 동적으로 추가 할 수 있도록 관리했습니다.
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
질문과 관련하여 이것은 XAML 기반 솔루션이 아니며 (언급 한대로 합리적인 방법이 없기 때문에) DataGrid.Columns와 직접 작동하는 솔루션도 아닙니다. 실제로 ITypedList를 구현하는 DataGrid 바인딩 된 ItemsSource와 함께 작동하며 PropertyDescriptor 검색을위한 사용자 지정 메서드를 제공합니다. 코드의 한 곳에서 그리드에 대한 "데이터 행"및 "데이터 열"을 정의 할 수 있습니다.
만약 당신이 :
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
예를 들어 사용할 수 있습니다.
var descriptors= new List<PropertyDescriptor>();
//retrieve column name from preprepared list or retrieve from one of the items in dictionary
foreach(var columnName in ColumnNames)
descriptors.Add(new DynamicPropertyDescriptor<Dictionary, string>(ColumnName, x => x[columnName]))
MyItemsCollection = new DynamicDataGridSource(Rows, descriptors)
MyItemsCollection에 대한 바인딩을 사용하는 그리드는 해당 열로 채워집니다. 이러한 열은 런타임에 동적으로 수정 (새로 추가 또는 기존 제거) 할 수 있으며 그리드는 열 컬렉션을 자동으로 새로 고칩니다.
위에서 언급 한 DynamicPropertyDescriptor는 일반 PropertyDescriptor 로의 업그레이드 일 뿐이며 몇 가지 추가 옵션과 함께 강력한 형식의 열 정의를 제공합니다. 그렇지 않으면 DynamicDataGridSource는 기본 PropertyDescriptor로 잘 작동합니다.