【发布时间】:2013-03-11 01:28:12
【问题描述】:
我正在使用 wpf 开发产品(使用 MVVM 模式)。根据用户的自定义(用户选择列),我必须将一组数据显示到数据网格中。目前,我正在将带有一组属性的ObservableCollection 绑定到数据网格的ItemSource。这将我限制在固定的列大小。
注意:列出了 n 个列名供用户选择。
如果它在后面的代码中完成,“datagrid.columns.add()”很容易。在这种情况下,任何人都可以帮助我吗?
我的 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;
var 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 +=
(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,正如你所说的 mvvm 并没有限制我的代码隐藏,我的 TL 是......
-
正如我所说,我使用 ObservableCollection
所以属性(列)是我的朋友“Angshuman Agarwal”预定义的。 -
另一种选择是使用附加属性并将其绑定到 VM 中的某些“ColumnInfo”对象列表,并在附加属性的 PropertyChanged 回调中的代码中创建列。