Создание табличного компонента с использованием шаблона, подобного DevExpress

#c# #blazor

#c# #blazor

Вопрос:

Я хотел бы создать табличный компонент, который будет работать как библиотека DevExpress, где мы можем сделать что-то вроде этого кода ниже. Я размышляю о том, как дочерние компоненты в этом коде отправляют значение параметров в ParentComponent (DxDataGrid)? Я пытался отправить ссылку на родительский элемент через cascadingvalue, но это не работает. Я думал об обратном вызове событий, но в приведенном ниже коде мы не назначаем никаких функций, и я тоже не хочу этого делать… Вы хоть представляете, как это работает?

Спасибо за любую помощь!

 <DxDataGrid DataAsync="@ForecastService.GetForecastAsync"
            PageSize="5"
            RowRemovingAsync="@OnRowRemoving"
            RowUpdatingAsync="@OnRowUpdating"
            RowInsertingAsync="@OnRowInserting"
            InitNewRow="@OnInitNewRow"
            CssClass="mw-1100">
    <DxDataGridCommandColumn Width="150px" />
    <DxDataGridDateEditColumn Field="@nameof(WeatherForecast.Date)" DisplayFormat="D" EditorFormat="d" EditorDisplayFormat="D" />
    <DxDataGridColumn Field="@nameof(WeatherForecast.Forecast)" Caption="Forecast" Width="150px" />
    <DxDataGridSpinEditColumn Field="@nameof(WeatherForecast.TemperatureC)" Caption="@("Temp. (x2103)")" TextAlignment="DataGridTextAlign.Left"
                              Width="150px" />
    <DxDataGridComboBoxColumn Field="@nameof(WeatherForecast.CloudCover)" Caption="Cloud Cover" DataAsync="@ForecastService.GetCloudCoverAsync"
                              TextAlignment="DataGridTextAlign.Left" Width="150px" />
    <DxDataGridCheckBoxColumn Field="@nameof(WeatherForecast.Precipitation)" Caption="Precipitation" Width="100px" />
</DxDataGrid>
  

Ответ №1:

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

Вам не нужно устанавливать EventCallBack себя в DxDataGrid . Вероятно, это делается внутренне.

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

Давайте попробуем понять, что такое <DxDataGridComboBoxColumn/>

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

 `<DxComboBox/>` (not appearing in your code) is I believe a component 
representing a ComboBox control. Thus, I guess that `<DxDataGridComboBoxColumn/>` is the parent component of `<DxComboBox/>`. Sound reasonable, no? 
  

Теперь я провел некоторый поиск и нашел этот код:

 <DxComboBox Data="@(new List<string>() { "In stock", "Sold out" })"
                        Value="@(((bool)((CellEditContext)context).CellValue) ? "In stock" : "Sold out" )"
                        ValueChanged="@((string newCellValue) => ((CellEditContext)context).OnChanged(newCellValue == "In stock"))">
            </DxComboBox> 
  

Что я здесь вижу? Как DxComboBox получает свои данные (из списка, созданного в строке. Также есть два атрибута: Value и ValueChanged
Value Атрибут представляет переменную DxComboBox , к которой привязан, в то время
ValueChanged как атрибут представляет метод, который должен вызываться, когда пользователь выбирает значение из DxComboBox (Html select element). Этот метод вызывается для уведомления родительского компонента DxComboBox об изменении значения, и он должен повторно отображаться, чтобы отразить это изменение. Обратите внимание, что базовым типом этого метода является EventCallBack .

Я советую вам перейти к документам и / или веб-сайтам, таким как chrissainty.com или blazoruniversity, и узнать там больше о компонентах, о том, как они взаимодействуют друг с другом, шаблонных компонентах и т. Д. Изучите основы Blazor, и однажды вы сможете создавать такие компоненты самостоятельно. В документации есть пример кода, как создавать шаблонные компоненты в виде таблицы. Начните с этого и продолжайте…

Ответ №2:

Проверьте DataGrid из Blazorise. Вы можете посмотреть исходный код на GitHub, если хотите создать свой собственный