Как добавить проверку данных в столбцы DataGrid в Avalonia?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как добавить проверку данных в столбцы DataGrid в Avalonia?

Сообщение 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));
}

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»