MVVM - Как создавать столбцы во время выполнения для xamdataGrid?

StackOverflow https://stackoverflow.com/questions/3425972

  •  26-09-2019
  •  | 
  •  

Вопрос

Я должен создать xamdataGrid, который показывает динамическое количество столбцов для временных кадров x к y. Поэтому я не знаю, сколько лет пользователь выберет, чтобы эти столбцы создавали аванс.

Теперь обычным в MVVM вы просто заполнили данные как многие свойства, поскольку вам понадобится столбцы в пределах вашей xamdataGrid, а последняя будет просто автогенерировать их.

Очевидно, я не мог просто создать свойства в моем просмотру во время выполнения, если я не сделал что-то безумие с отражением.

Как еще я добился этого?

Должен ли я просто создать несвязанные поля для DataGrid и заполнить их через код? Я согласен, что я не понадобимуся двусторонней связывающей на этом этапе, так как сетка только готовность ... просто думая громко.

Этот подход ОК, не нарушая шаблон MVVM? Спасибо

Это было полезно?

Решение

Вы можете использовать индексаторы:

В вашей ViewModel:

public MyVariableCollection RowData
{
    get { return new MyVariableCollection(this); }
}

В MyVariableCollection: защищены somerowviewmodel ViewModel;

public MyVariableCollection(SomeRowViewModel viewmodel)
{
    this.viewModel = viewmodel;
}

public object this[string name]
{
    get { return viewModel.GetRowColumnValue(name); }
}

Я пытался сохранить его кратки: но идея в том, что у вас есть новый класс с определенным индексом, то вы можете связать так:

{Binding Path=SomeRowViewModelInstance.RowData["ColumnName"]}

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

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


Редактировать для дополнительной мысли: я использовал содержимое ComponentModel пространство имен, чтобы произвести обычай TypeDescriptor. Отказ Это довольно глубокое, но вы можете сделать объект «кажутся», чтобы иметь дополнительные или пользовательские свойства. Это гораздо более сложный, чем метод индекса, который я опубликовал выше, но если вы застряли, это стоит посмотреть.

Другие советы

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

Я написал контроль, содержащий DataGrid XAM и обнаружив свойство зависимости данных для связывания модели для сетки (то есть таблица данных).

Каждый раз, когда источник изменен (вы можете добавить слушателей событий для ProgriseChanged, а сетки полевой клаенсиинициализирующие события) Сетка была динамически пересмотрена путем очистки его данных и сбрасывать его:

private void ReRenderGrid()
{
    XamDataGrid.FieldLayouts.Clear();
    XamDataGrid.ClearValue(DataPresenterBase.DataSourceProperty);
    XamDataGrid.DataSource = DataSource.Data.DefaultView;
}

Столбцы настраиваются настроенным обработчиком событий на следующем событии, который поднимается XAMDataGrid после сброса данных GRIDS:

XamDataGrid.FieldLayoutInitializing += LayoutInitializing;

Обработчик:

private void LayoutInitializing(object sender, FieldLayoutInitializingEventArgs e)
{
    const string deletebuttonstyle = "DeleteButtonStyle";
    const string requiredinputvalue = "RequiredInputValue";
    const string optionalinputvalue = "OptionalInputValue";
    const string outputvalue = "OutputValue";

    var fieldLayout = e.FieldLayout;
    fieldLayout.Fields.Clear();

    AddFields(DataSource.InColumns, requiredinputvalue, fieldLayout);
    AddSplitter(fieldLayout);
    AddFields(DataSource.OptionalInColumns, optionalinputvalue, fieldLayout);
    AddSplitter(fieldLayout);
    AddFields(DataSource.OutColumns, outputvalue, fieldLayout);

    AddUnboundField(fieldLayout, string.Empty, GetStyle(deletebuttonstyle));
}

В моем случае DataSource содержит все столбцы, настроенные пользователем. Addfields вызывает этот метод для каждого списка записи:

private void AddField(string name, Style style, FieldLayout fieldLayout)
{
    var field = new Field {Name = name};
    field.Settings.LabelPresenterStyle = style;
    field.Settings.CellValuePresenterStyle = GetStyle("StandardCellValueStyle");
    fieldLayout.Fields.Add(field);
}

AddSplitter и AddunBoundField реализуются аналогичным образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top