.NET MAUI – внедрение зависимостей – конструктор никогда не вызываетсяC#

Место общения программистов C#
Anonymous
.NET MAUI – внедрение зависимостей – конструктор никогда не вызывается

Сообщение Anonymous »

Я пытаюсь создать универсальное всплывающее окно, которое позволит мне повторно использовать его в различных случаях. По какой-то причине конструктор моей модели представления никогда не вызывается, хотя я его регистрирую и вызываю правильно.
Вот как я регистрирую его в своем MauiProgram.cs:

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

builder.Services.AddTransientPopup();
Это мой общий абонент:

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

public async Task DisplayBottomPickerAsync(CancellationToken token = default)
where TViewModel : PickerBottomSheetViewModel
where TItem : IPickableItem
{
var result = await _popup.ShowPopupAsync(Shell.Current, GetOptions(true), token);
return result.WasDismissedByTappingOutsideOfPopup ? default : result.Result;
}
Это код, который я использую для его вызова:

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

var result = await _popup.DisplayBottomPickerAsync(token);
Это важная часть кода, совместного использования всех классов было бы слишком много (упорядочено путем наследования):

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

public abstract partial class PickerBottomSheetViewModel : ViewModelBase

public abstract partial class PickerBottomSheetViewModel : PickerBottomSheetViewModel where T : IPickableItem

public sealed partial class BaitPickerViewModel : PickerBottomSheetViewModel
{
private readonly SqliteStorage _sql;
private readonly ILocalizationResourceManager _lang;

public BaitPickerViewModel(PopupHost popup, SqliteStorage sql, ILocalizationResourceManager lang) : base(popup)
{
_sql = sql; //Never called
_lang = lang;

Title = _lang["SelectBaitTitle"];
AddNewText = _lang["AddNewBait"];
CanEditOrDelete = true;
}

protected override IAsyncEnumerable LoadTypedItemsAsync(CancellationToken token) => _sql.EnumerateBaitsAsync(token);
protected override Task AddTypedItemAsync(CancellationToken token) => base.AddTypedItemAsync(token);
protected override Task EditTypedItemAsync(Bait item, CancellationToken token) => base.EditTypedItemAsync(item, token);
protected override Task DeleteTypedItemAsync(Bait item, CancellationToken token) => base.DeleteTypedItemAsync(item, token);
}
Само всплывающее окно:

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

public sealed partial class PickerBottomSheet : Popup
{
public PickerBottomSheet()
{
InitializeComponent();
}
}
Я действительно понятия не имею, почему это не работает. Я не получаю исключения, и всплывающее окно даже отображается. Однако без значений, которые я назначаю, потому что конструктор даже не вызывается.
Изменить
Если я передаю BaitPickerViewModel непосредственно в PickerBottomSheet, это работает. Но это нежизнеспособное решение, так как тогда я не смогу использовать другие модели представления, в этом и весь смысл этой конструкции.
Также передача PickerBottomSheetViewModel невозможна, поскольку она абстрактна.

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