Est-il possible d'obtenir des colonnes dynamiques sur wpf datagrid dans le pattern mvvm?

Im le développement d'un produit dans wpf mvvm (pattern). J'ai un scénario dans lequel j'ai passé plus d'une semaine pour aucun bon résultat. Svp aider moi si vous pouvez...
Voici le scénario, en fonction de l'utilisateur, la personnalisation de l'utilisateur(utilisateur ll sélectionnez les colonnes), je dois afficher un ensemble de données dans la grille de données. Actuellement, im la liaison d'une ObservableCollection avec l'ensemble de propriétés à la itemsource de grille de données. Cela me limite fixe taille de la colonne.
Remarque: Le nombre n de colonnes le nom est indiqué pour sélection de l'utilisateur.
Si c'est fait dans le code derrière, il est facile par la "grille de données.les colonnes.add()". Quelqu'un peut-il là pour m'aider dans ce scénario.

mon xaml:

<my:DataGrid AutoGenerateColumns="False" Margin="357,121.723,82,41" Name="dataGrid3" c:DataGridExtension.Columns="{Binding ColumnCollection}" />

ma classe de commande:

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);
                        //}
                    }
                };

            }
        }
    }
}

et ma propriété dans le 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 ne pas restreindre vous d'utiliser le code-behind
Brut moyen - Créer toutes les colonnes à l'avance et de cacher ce qui n'est pas sélectionné par l'utilisateur.
blindmeis, comme tu dit mvvm ne pas me restreindre code-behind, ma TL...
comme je l'ai dit, im en utilisant ObservableCollection<Interface> ainsi, les propriétés(colonnes) sont prédéfinis mon ami "Angshuman Agarwal".
Une autre option est d'utiliser une propriété attachée et lier cela à quelques-uns de la Liste des "ColumnInfo" des objets dans votre VM et de créer des colonnes dans le code de la PropertyChanged rappel de la propriété attachée.

OriginalL'auteur Vinoth Ezhilan M | 2013-03-21