Подтвердить что ты не робот

Динамические столбцы DataGrid WPF MvvM

Я ищу о том, как создавать столбцы DataGrid из динамика ToolKit в режиме MvvM. Но похоже, что это невозможно!

Есть ли кто-то, кто должен был сделать что-то?

нет необходимости создавать usercontrol или другой элемент управления, который поступает из DataGrid, я просто хочу установить элемент ItemSource в свой пользовательский объект, и в какой-то момент я хочу определить столбцы сетки в динамической динамической среде в виде объекта.

Возможно ли это?

веселит

4b9b3361

Ответ 1

Я собираюсь предисловие к этому, сказав, что, возможно, это не лучшее решение, которое может быть выполнено, и может не работать в некоторых ситуациях, но вы можете попробовать и посмотреть, будет ли он работать для того, что вы хотите. Я просто взбивал это, так что в нем могут быть некоторые ошибки. Его по-прежнему будет включать некоторый код, но он не позволяет вашей модели узнать о вас.

Что вам нужно сделать, это создать свойство расширения, которое позволит вам связать свойство Columns в DataGrid. Вот пример, который я собрал.

using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;

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

Затем вы прикрепляете его к вам DataGrid следующим образом (Где столбцы - свойство ObservableCollection в вашей модели представления)

<Controls:DataGrid AutoGenerateColumns="False" 
            DataGridExtension.Columns="{Binding Columns}" />

Я не уверен, насколько хорошо он будет реагировать, если вы начнете добавлять и удалять столбцы, но, похоже, это работает из моего базового тестирования. Удачи!

Ответ 2

Имея аналогичную проблему, я не хотел добавлять другое свойство зависимостей. Мое обходное решение состояло в том, чтобы организовать данные для отображения в DataGrid в DataTable и привязать свойство DataGrid ItemSource к этому DataTable (при условии, что AutoGenerateColumns установлено в true).

Это хорошо работает, DataGrids кажется счастливым с DataTable в качестве источника.