Wie kann ich meinen Inhalt von Avalonia Datagrids zum Anzeigen bringen?
Posted: 16 Feb 2025, 13:04
Ich habe die Dokumente (https://docs.avaloniaui.net/docs/refere ... /datagrid/) gelesen. Br />
Ich hoffe, das hilft. Bitte stellen Sie weitere Fragen zu meinem Code!>
Code: Select all
< /code>
Ich möchte ein "ListUSerControl" als Basisklasse zum Anzeigen verschiedener DB -Modelltypen in ihren abgeleiteten Klassen erstellen. < /p>
< /code>
Das Textfeld wird ohne Probleme angezeigt, aber beim Öffnen des visuellen Baum Das Sichtbarkeitsflag wird korrekt festgelegt) < /p>
Ein Bild meines visuellen Baumes und der leere ContentControl < /p>
Die Basisklasse erstellt dann ein Datagrid und verwendet ein 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>
Die Datenagrid -Erstellung einer bestimmten abgeleiteten Klasse (in diesem Fall Schule): < /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>
Und dann wird das ListViewModel die DB -Modelle abgerufen und legt die ElementSource fest: < /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>
Beim Debuggen sehe ich, dass die Modelsliste korrekt mit Elementen gefüllt ist und ich denke, dass ich das DataGrids -Erscheinungsbild korrekt konfiguriert habe: < /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;
}
}