Wie kann ich meinen Inhalt von Avalonia Datagrids zum Anzeigen bringen?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich meinen Inhalt von Avalonia Datagrids zum Anzeigen bringen?

Post by Anonymous »

Ich habe die Dokumente (https://docs.avaloniaui.net/docs/refere ... /datagrid/) gelesen. Br />

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;
}
}
Ich hoffe, das hilft. Bitte stellen Sie weitere Fragen zu meinem Code!>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post