Как получить доступ к свойству модели ObservableCollection для привязки данных во всплывающем окне оболочки?

Я создаю свое первое приложение 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>

Спасибо, что обратили внимание на мою проблему. Это мой первый пост!

Я пробовал устанавливать относительные пути, предков, пытался получить доступ к свойствам терминов в наблюдаемой коллекции. Кажется, не могу заставить его работать.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать установить 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}"/> 

Я вернулся и решил использовать это, и это сработало! Спасибо!

Lorenzo Ortiz 14.06.2024 22:45

Другие вопросы по теме