У меня есть приложение .Net 8.0/AvalonuaUI для редактирования таблиц с помощью CommunityToolkit для MVVM.
Конфигурация таблицы определяется во время выполнения. Поэтому я привязываю DataGrid к коллекции object[], а затем создаю столбцы во время выполнения.
Мне нужно особым образом проверять входные данные в каждом столбце.
Например, используя минимальное и максимальное число для числовых параметров (минимальное и максимальное значения также определяются во время выполнения) или TimeSpan.TryParse() для параметров времени.
Как создать собственные валидаторы и привязать их к столбцам?
На данный момент я создаю столбцы в MainWindow.axaml.cs следующим образом
(Я знаю, что это плохо для MVVM, но мне кажется, что это самый простой способ динамического создания столбцов):
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public void BuildDataGridColumns(Parameter[] structure)
{
dataGrid.Columns.Clear();
for(int i = 0; i < structure.Length; i++)
dataGrid.Columns.Add(CreateColumn(structure, i));
}
private DataGridColumn CreateColumn(Parameter parameter, int index)
{
switch(parameter.Type.Name)
{
case nameof(Boolean):
{
return new DataGridCheckBoxColumn() {
Header = parameter.Name,
Binding = new Binding($"[{index}]"),
IsReadOnly = false,
};
}
case nameof(Int32):
case nameof(Single):
{
return new DataGridTextColumn() {
Header = parameter.Name,
Binding = new Binding($"[{index}]"),
IsReadOnly = false
//Something like Validator = NumberValidator, etc
};
}
default: throw new NotImplementedException();
}
}
}
MainWindowViewModel.cs
public partial class MainWindowViewModel : ViewModelBase
{
public ObservableCollection Rows { get; set; }
private MainWindow? _view;
//Empty cunstructor for preview
public MainWindowViewModel() : this(null) { }
public MainWindowViewModel(MainWindow? view)
{
_view = view;
Rows = [[123, 172.32f, true], [321, 3.14f, false], [567, 2.71f, true]];
Parameter[] structure = new Parameter[] {
new Parameter("Int", typeof(Int32)),
new Parameter("Float", typeof(Single)),
new Parameter("Bool", typeof(Boolean))
};
_view?.BuildDataGridColumns(structure);
}
}
Parameter.cs
public class Parameter
{
public string Name;
public Type Type;
public Parameter(string name, Type type)
{
Name = name;
Type = type;
}
}
Двусторонняя ссылка в App.axaml.cs
public partial class App : Application
{
//... generated code ...
public override void OnFrameworkInitializationCompleted()
{
if(ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
BindingPlugins.DataValidators.RemoveAt(0);
MainWindow mainWindow = new MainWindow();
mainWindow.DataContext = new MainWindowViewModel(mainWindow);
desktop.MainWindow = mainWindow;
}
base.OnFrameworkInitializationCompleted();
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... n-avalonia
Как добавить проверку данных в столбцы DataGrid в Avalonia? ⇐ C#
Место общения программистов C#
-
Anonymous
1728868075
Anonymous
У меня есть приложение .Net 8.0/AvalonuaUI для редактирования таблиц с помощью CommunityToolkit для MVVM.
Конфигурация таблицы определяется во время выполнения. Поэтому я привязываю DataGrid к коллекции object[], а затем создаю столбцы во время выполнения.
Мне нужно особым образом проверять входные данные в каждом столбце.
Например, используя минимальное и максимальное число для числовых параметров (минимальное и максимальное значения также определяются во время выполнения) или TimeSpan.TryParse() для параметров времени.
Как создать собственные валидаторы и привязать их к столбцам?
На данный момент я создаю столбцы в MainWindow.axaml.cs следующим образом
(Я знаю, что это плохо для MVVM, но мне кажется, что это самый простой способ динамического создания столбцов):
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public void BuildDataGridColumns(Parameter[] structure)
{
dataGrid.Columns.Clear();
for(int i = 0; i < structure.Length; i++)
dataGrid.Columns.Add(CreateColumn(structure[i], i));
}
private DataGridColumn CreateColumn(Parameter parameter, int index)
{
switch(parameter.Type.Name)
{
case nameof(Boolean):
{
return new DataGridCheckBoxColumn() {
Header = parameter.Name,
Binding = new Binding($"[{index}]"),
IsReadOnly = false,
};
}
case nameof(Int32):
case nameof(Single):
{
return new DataGridTextColumn() {
Header = parameter.Name,
Binding = new Binding($"[{index}]"),
IsReadOnly = false
//Something like Validator = NumberValidator, etc
};
}
default: throw new NotImplementedException();
}
}
}
MainWindowViewModel.cs
public partial class MainWindowViewModel : ViewModelBase
{
public ObservableCollection Rows { get; set; }
private MainWindow? _view;
//Empty cunstructor for preview
public MainWindowViewModel() : this(null) { }
public MainWindowViewModel(MainWindow? view)
{
_view = view;
Rows = [[123, 172.32f, true], [321, 3.14f, false], [567, 2.71f, true]];
Parameter[] structure = new Parameter[] {
new Parameter("Int", typeof(Int32)),
new Parameter("Float", typeof(Single)),
new Parameter("Bool", typeof(Boolean))
};
_view?.BuildDataGridColumns(structure);
}
}
Parameter.cs
public class Parameter
{
public string Name;
public Type Type;
public Parameter(string name, Type type)
{
Name = name;
Type = type;
}
}
Двусторонняя ссылка в App.axaml.cs
public partial class App : Application
{
//... generated code ...
public override void OnFrameworkInitializationCompleted()
{
if(ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
BindingPlugins.DataValidators.RemoveAt(0);
MainWindow mainWindow = new MainWindow();
mainWindow.DataContext = new MainWindowViewModel(mainWindow);
desktop.MainWindow = mainWindow;
}
base.OnFrameworkInitializationCompleted();
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79084482/how-to-add-data-validation-to-the-datagrids-columns-in-avalonia[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия