< /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://docs.avaloniaui.net/docs/reference/controls/datagrid/), установил пакет, который мне нужен для документа и вставлен стиль в мой app.axaml < Br />[code]
< /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; }
// 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 = [];
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; } } [/code] Надеюсь, это поможет, пожалуйста, не стесняйтесь задавать дополнительные вопросы о моем коде!