У меня есть приложение .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#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение