Я создаю свое первое приложение MAUI, которое является средством отслеживания терминов (с набором инструментов сообщества MVVM). Я вручную добавил в базу данных несколько терминов и пытаюсь отобразить их во всплывающем окне. Мне удалось заставить их отображаться во всплывающем окне, но у меня возникли проблемы с получением имени термина для привязки данных, и я получаю сообщение об ошибке:
Привязка: свойство «Имя» не найдено в TermTracker.ViewModel.TermViewModel.
Вот все мои соответствующие файлы.
Термин «модель с использованием SQLite».
using SQLite;
namespace TermTracker.Model;
[Table("Terms")]
public class Term
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string? Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
Получение терминов, помещение моделей терминов в ObservableCollection и их возврат.
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
namespace TermTracker.Model
{
public static class TermRepository
{
public static async Task<ObservableCollection<Term>> GetTerms()
{
var db = LocalDatabase.GetConnection();
var terms = new ObservableCollection<Term>();
var queryResult = await db.QueryAsync<Term>("SELECT * FROM Terms");
foreach (var term in queryResult)
{
terms.Add(new Term
{
Name = term.Name,
StartDate = term.StartDate,
EndDate = term.EndDate
});
}
return terms;
}
}
}
Добавление соответствующих элементов для DI
using Microsoft.Extensions.Logging;
using TermTracker.Model;
using TermTracker.View;
using TermTracker.ViewModel;
namespace TermTracker
{
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
builder.Services.AddTransient<AppShell>();
builder.Services.AddTransient<TermViewModel>();
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder.Build();
}
}
}
Установка контекста привязки в качестве TermViewModel
using TermTracker.Model;
using TermTracker.View;
using TermTracker.ViewModel;
namespace TermTracker
{
public partial class AppShell : Shell
{
public AppShell(TermViewModel viewModel)
{
InitializeComponent();
BindingContext = viewModel;
Routing.RegisterRoute(nameof(AddTermPage), typeof(AddTermPage));
}
}
}
Добавляю модель представления, тип данных и настройку всплывающего меню.
<?xml version = "1.0" encoding = "UTF-8" ?>
<Shell
x:Class = "TermTracker.AppShell"
xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local = "clr-namespace:TermTracker"
xmlns:view = "clr-namespace:TermTracker.View"
xmlns:viewModel = "clr-namespace:TermTracker.ViewModel"
x:DataType = "viewModel:TermViewModel"
Shell.FlyoutBehavior = "Flyout"
Title = "TermTracker">
<Shell.Resources>
<DataTemplate x:Key = "FlyoutTermTemplate">
<TextCell Text = "{Binding Name}"/>
This is where the problem is. Terms.Name doesn't work either. I want the text of the flyout item to be the name of the term model in the observable collection.
Oddly, when I do Binding Name when the app is running and it hotloads, it works but when I stop/try to restart my app I get the error.
</DataTemplate>
</Shell.Resources>
<Shell.FlyoutContentTemplate>
<DataTemplate>
<ListView
ItemsSource = "{Binding Terms}"
ItemTemplate = "{StaticResource FlyoutTermTemplate}"/>
</DataTemplate>
</Shell.FlyoutContentTemplate>
<ShellContent Title = "Home"
ContentTemplate = "{DataTemplate view:MainPage}"
Route = "MainPage"/>
</Shell>
Спасибо, что обратили внимание на мою проблему. Это мой первый пост!
Я пробовал устанавливать относительные пути, предков, пытался получить доступ к свойствам терминов в наблюдаемой коллекции. Кажется, не могу заставить его работать.





Вы можете попробовать установить x:DataType для DataTemplate. Такой как:
<Shell
x:Class = "TermTracker.AppShell"
xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local = "clr-namespace:TermTracker"
xmlns:view = "clr-namespace:TermTracker.View"
xmlns:model = "clr-namespace:TermTracker.Model"
xmlns:viewModel = "clr-namespace:TermTracker.ViewModel"
x:DataType = "viewModel:TermViewModel"
Shell.FlyoutBehavior = "Flyout"
Title = "TermTracker">
<Shell.Resources>
<DataTemplate x:DataType = "model:Term" x:Key = "FlyoutTermTemplate">
<TextCell Text = "{Binding Name}"/>
Я вернулся и решил использовать это, и это сработало! Спасибо!