Как я могу привлечь контент DataGrids Avalonia?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу привлечь контент DataGrids Avalonia?

Сообщение Anonymous »

Я читаю документы (https://docs.avaloniaui.net/docs/refere ... /datagrid/), установил пакет, который мне нужен для документа и вставлен стиль в мой app.axaml < Br />

Код: Выделить всё








< /code>
Я стремлюсь создать «listusercontrol» в качестве базового класса для отображения различных типов модели БД в их полученных классах. < /p>








< /code>
Textbox отображается без каких -либо проблем, но при открытии визуального дерева я вижу, что DataGrid находится в ContentControl и видит его макет, но не его содержание, оно в основном невидимо (я проверил и Флаг видимости устанавливается правильно) < /p>
Изображение моего визуального дерева и пустого ContentControl < /p>
Базовый класс затем создает DataGrid и использует ViewModel.  < /p>
public abstract partial class ListUserControl : UserControl
{
public ListUserControl()
{
InitializeComponent();

// Verzögertes Laden, damit DataContext gesetzt werden kann
Loaded += ListUserControl_Loaded;
}

async void ListUserControl_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
BaseDataGrid dataGrid = GetDataGridObject();

var viewModel = CreateListViewModel(dataGrid);
DataContext = viewModel;

ListDataGridContentControl.Content = dataGrid;
await viewModel.SetupAsync();
}

protected abstract IListViewModel CreateListViewModel(BaseDataGrid baseDataGrid);

protected abstract BaseDataGrid GetDataGridObject();
}
< /code>
Создание DataGrid конкретного производного класса (в этом случае школа): < /p>
        protected override BaseDataGrid GetDataGridObject()
{
BaseDataGrid baseDataGrid = new();

baseDataGrid.Columns.Add(new DataGridTextColumn()
{
Header = "Name",
Binding = new Binding(nameof(Schule.Name))
});

// Events binden
baseDataGrid.PointerReleased += (sender, e) =>
{
if (e.Source is DataGridCell cell && cell.Parent is DataGridRow row)
{
if (row.DataContext is Schule schule)
{
OnSchuleSelected?.Invoke(this, schule);
}
}
};

return baseDataGrid;
}
< /code>
, а затем ListViewModel получает модели DB и устанавливает itemource: < /p>
public partial class ListViewModel(BaseDataGrid dataGrid, Task getModelsTask) : ObservableObject, IListViewModel
{
readonly Task GetModelsTask = getModelsTask;
readonly Dictionary PrimaryKeyModelsDict = [];
List AllModels = [];

[ObservableProperty]
private string searchText = string.Empty;

[ObservableProperty]
private ObservableCollection angezeigteModels = [];

public async Task SetupAsync()
{
AllModels = [..  await GetModelsTask];

dataGrid.ItemsSource = AngezeigteModels;

AngezeigteModels.Clear();
foreach (var model in AllModels)
{
AngezeigteModels.Add(model);
}

foreach (var model in AllModels)
{
var primaryKey = ListViewModel.GetPrimaryKey(model);
PrimaryKeyModelsDict[primaryKey] = model;
}
}

void AngezeigteElementeAktualisieren()
{
if (string.IsNullOrWhiteSpace(SearchText))
{
AngezeigteModels.Clear();
foreach (var model in AllModels)
{
AngezeigteModels.Add(model);
}
}
else
{
// Filtere die Keys nach dem Suchstring
var matchingModels = PrimaryKeyModelsDict
.Where(entry => entry.Key.Contains(SearchText, StringComparison.OrdinalIgnoreCase)) // Key enthält den Suchstring
.Select(entry => entry.Value); // Alle Models dieser Keys zusammenführen

// Anzeige aktualisieren
AngezeigteModels.Clear();
foreach (var model in matchingModels)
{
AngezeigteModels.Add(model);
}
}
}

static string GetPrimaryKey(T model)
{
var properties = typeof(T).GetProperties(); // Holt alle Eigenschaften des Models per Reflection
return properties.Length > 0 ? properties[0].GetValue(model)?.ToString() ?? string.Empty : string.Empty;
}

partial void OnSearchTextChanged(string value) => AngezeigteElementeAktualisieren();
}
< /code>
При отладте я вижу, что список моделей заполняется правильно элементами, и я думаю, что я правильно настроил внешний вид данных: < /p>
    public class BaseDataGrid : DataGrid
{
public BaseDataGrid()
{
GridLinesVisibility = DataGridGridLinesVisibility.All;
BorderThickness = new Avalonia.Thickness(1);
BorderBrush = Avalonia.Media.Brushes.Black;
this.ColumnHeaderHeight = 100;
this.RowHeight = 100;
this.HeadersVisibility = DataGridHeadersVisibility.All;
AutoGenerateColumns = false;
CanUserResizeColumns = true;
}
}
Надеюсь, это поможет, пожалуйста, не стесняйтесь задавать дополнительные вопросы о моем коде!

Подробнее здесь: https://stackoverflow.com/questions/794 ... to-show-up
Ответить

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

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

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

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

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