< /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!>
Ich habe die Dokumente (https://docs.avaloniaui.net/docs/reference/controls/datagrid/) gelesen. Br />[code]
< /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; }
// 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 = [];
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; } } [/code] Ich hoffe, das hilft. Bitte stellen Sie weitere Fragen zu meinem Code!>
Ich versuche, das Quadrat/Tick -Kästchen eines Avalonia -Kontrollkästchens in seinem Inhalt automatisch vertikal auszurichten, aber anscheinend ist es aus irgendeinem Grund nicht so trivial. Hier ist...
Ich habe ein Problem beim Versuch, ein ExpandoObject in mein Datagrid zu binden. Das Laden dauert zu lange. Für 6 Spalten und 50 Zeilen dauert es beispielsweise etwa 10 Sekunden.
Ich verwende...
Ich brauche diesen Code, um nur „y“ oder „n“ für die sYesOrNo-Eingabe zu akzeptieren. Wenn der Benutzer eine ungültige Eingabe eingibt, benötige ich sie, um die Eingabeaufforderung „sYesorNo“ erneut...
Ich verwende einen Woot -Produktfilter für WooCommerce und versuche, Suchergebnisse in Husky -Produkttabelle (verwendet werden) für WooCommerce zu zeigen. Code -Analphabet mit Divi Theme Builder. Ich...