Sto sviluppando un prodotto in wpf (modello mvvm). Ho uno scenario in cui ho trascorso più di una settimana senza risultati positivi. Pls aiutami se puoi ... Ecco lo scenario, in base alla personalizzazione dell'utente (l'utente ll seleziona le colonne) Devo visualizzare un insieme di dati in datagrid. Attualmente sto legando una ObservableCollection con un insieme di proprietà alla fonte di dati di datagrid. Questo mi limita a dimensioni di colonna fisse. Nota: il numero n di colonne nome è elencato per la selezione dell'utente. Se è fatto in codice dietro è facile da "datagrid.columns.add()". Qualcuno là fuori può aiutarmi in questo scenario.E 'possibile ottenere colonne dinamiche su datagrid wpf nel modello mvvm?
mia XAML:
<my:DataGrid AutoGenerateColumns="False" Margin="357,121.723,82,41" Name="dataGrid3" c:DataGridExtension.Columns="{Binding ColumnCollection}" />
la mia classe di comando:
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);
//}
}
};
}
}
}
}
e la mia proprietà 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);
}
}
mvvm non limita l'utilizzo del codice dietro – blindmeis
Modalità grezza: crea tutte le colonne in primo piano e nasconde ciò che non è selezionato dall'utente. –
blindmeis, come hai detto mvvm non mi limita il codice, i miei TL sono ... –