wpf (mvvm 패턴)로 제품을 개발 중입니다. 나는 좋은 결과를 얻지 못해 일주일 이상을 보냈다. 당신이 할 수있는 경우 Pls 날 도와 ... 사용자의 사용자 정의 (사용자가 열을 선택합니다)에 따라 시나리오가 있는데, 나는 데이터 집합에 데이터 집합을 표시해야합니다. 현재 메신저는 ObservableCollection을 DataGrid의 itemsource에 속성 집합으로 바인딩합니다. 이렇게하면 고정 된 열 크기로 제한됩니다. 주 : n 개의 열 이름은 사용자가 선택할 수 있도록 나열됩니다. "datagrid.columns.add()"를 사용하면 코드 뒤에 쉽게 코드를 작성할 수 있습니다. 어느 누구도이 시나리오에서 나를 도울 수 있습니까?mvvm 패턴의 wpf DataGrid에서 동적 열을 가져올 수 있습니까?
내 XAML :
<my:DataGrid AutoGenerateColumns="False" Margin="357,121.723,82,41" Name="dataGrid3" c:DataGridExtension.Columns="{Binding ColumnCollection}" />
이 내 명령 클래스
: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);
//}
}
};
}
}
}
}
와 뷰 모델에서 내 재산 : 당신의 노력 남자의 대한
private ObservableCollection<DataGridColumn> _columnCollection = new ObservableCollection<DataGridColumn>();
public ObservableCollection<DataGridColumn> ColumnCollection
{
get
{
return this._columnCollection;
}
set
{
_columnCollection = value;
base.OnPropertyChanged("ColumnCollection");
//Error
//base.OnPropertyChanged<ObservableCollection<DataGridColumn>>(() => this.ColumnCollection);
}
}
mvvm은 코드 숨김을 사용하도록 제한하지 않습니다. – blindmeis
Crude way - 모든 열을 미리 생성하고 사용자가 선택하지 않은 것을 숨 깁니다. –
blindmeis, 내가 말했듯이, mvvm이 codebehind를 제한하지 않는다고 말하면, 나의 TL은 ... –