MVVM - Как создавать столбцы во время выполнения для xamdataGrid?
-
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 реализуются аналогичным образом.