Im developing a product in wpf (mvvm pattern). I have a scenario in which i have spent more than a week for no good result. Pls help me if you can... Here is the scenario, according to the user's customization(user ll select the columns) i have to display a set of data into datagrid. Currently im binding a ObservableCollection with set of properties to the itemsource of datagrid. This limits me to fixed column size. Note: The n number of columns name is listed out for user's selection. If its done in code behind it is easy by "datagrid.columns.add()". Can any one out there help me in this scenario.
my xaml:
<my:DataGrid AutoGenerateColumns="False" Margin="357,121.723,82,41" Name="dataGrid3" c:DataGridExtension.Columns="{Binding ColumnCollection}" />
my command class:
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);
//}
}
};
}
}
}
}
and my property in viewmodel:
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);
}
}
Thanks for your effort guy's... finally i have found the solution....
here its..(full wpf mvvm)
In my command file:
in my xaml:
and finaly in my viewmodel:
and in my constructor:
I would like to extend the previous example (answer) the ability to subscribe and unsubscribe on event CollectionChanged.
Behavior (add reference on System.Windows.Interactivity):
View:
ViewModel: