나는 어쩌면 일을 할 수있는 최선의 해결책이 아니라 말함으로써이 서문거야 어떤 상황에서 작동하지 않을 수 있습니다하지만 당신은 그것을 시도하고 그것을 위해 작동하는지 볼 수 있습니다 당신이 원하는. 나는 그걸 좀 채찍질하여 그 안에 약간의 버그가있을 수 있습니다. 아직 몇 가지 코드가 포함될 예정이지만 모델이보기에 대해 알지 못하게합니다.
DataGrid의 Columns 속성을 바인딩 할 수있는 확장 속성을 만들면됩니다. 다음은 제가 함께 모범을 보인 예입니다. 그런 다음
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;
public static class DataGridExtension
{
public static ObservableCollection<DataGridColumn> GetColumns(DependencyObject obj)
{
return (ObservableCollection<DataGridColumn>)obj.GetValue(ColumnsProperty);
}
public static void SetColumns(DependencyObject obj, ObservableCollection<DataGridColumn> value)
{
obj.SetValue(ColumnsProperty, value);
}
public static readonly DependencyProperty ColumnsProperty =
DependencyProperty.RegisterAttached("Columns",
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridExtension),
new UIPropertyMetadata (new ObservableCollection<DataGridColumn>(),
OnDataGridColumnsPropertyChanged));
private static void OnDataGridColumnsPropertyChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (d.GetType() == typeof(DataGrid))
{
DataGrid myGrid = d as DataGrid;
ObservableCollection<DataGridColumn> Columns =
(ObservableCollection<DataGridColumn>)e.NewValue;
if(Columns != null)
{
myGrid.Columns.Clear();
if (Columns != null && Columns.Count > 0)
{
foreach (DataGridColumn dataGridColumn in Columns)
{
myGrid.Columns.Add(dataGridColumn);
}
}
Columns.CollectionChanged += delegate(object sender,
NotifyCollectionChangedEventArgs args)
{
if(args.NewItems != null)
{
foreach (DataGridColumn column
in args.NewItems.Cast<DataGridColumn>())
{
myGrid.Columns.Add(column);
}
}
if(args.OldItems != null)
{
foreach (DataGridColumn column
in args.OldItems.Cast<DataGridColumn>())
{
myGrid.Columns.Remove(column);
}
}
};
}
}
}
}
이 같은 데이터 그리드 당신에 부착 내가 당신 경우 응답 것입니다 얼마나 잘 모르겠어요
<Controls:DataGrid AutoGenerateColumns="False"
DataGridExtension.Columns="{Binding Columns}" />
(여기서 열은보기 모델에 ObservableCollection에 속성이다) 열 추가 및 제거를 시작하지만 기본 테스트에서 작동하는 것 같습니다. 행운을 빕니다!
위 코드는 일반적으로 작업을 수행합니다. 그러나 DataGrid를 숨기고 다시 표시 할 때 실패합니다. columns 속성은 숨겨져 있고 columns 속성이 변경 될 때 0 열이 표시되므로 콜백이 실행되고 열을 다시 추가하려고 시도하지만 실제로 데이터 그 릿에 열이 있으므로 코드가 중복 열을 추가 할 수 없다는 예외가 있으면 실패합니다. –