Как я могу связать текст MenuItem (и, если возможно, IconImageSource)?

У меня есть приложение .Net MAUI. Я определяю меню в AppShell.xaml. Один элемент меню:

          <MenuItem Text="{Binding LoginText}"
          IconImageSource="{Binding LoginIcon}"
          Command="{Binding ToggleLoginCommand}" />

Я устанавливаю контекст привязки в AppShell.xaml.cs:

      public AppShell()
{
    InitializeComponent();

    BindingContext = new Menu();
    ...

Это класс меню:

      public partial class Menu : ObservableObject
{
    protected const string _textSignIn = "Sign In";
    protected const string _textSignOut = "Sign Out";
    protected const string _iconSignIn = "IconSignIn";
    protected const string _iconSignOut = "IconSignOut";
...
    public Menu()
    {
        _loginIcon = App.IsLoggedIn ? _iconSignOut : _iconSignIn;
        _loginText = App.IsLoggedIn ? _textSignOut : _textSignIn;
    }

    [ObservableProperty]
    private string _loginIcon;

    [ObservableProperty]
    private string _loginText;

...
    [ICommand]
    protected async Task ToggleLoginAsync()
    {
        ...
        _loginIcon = App.IsLoggedIn ? _iconSignOut : _iconSignIn;
        _loginText = App.IsLoggedIn ? _textSignOut : _textSignIn;
        ...
    }

В Styles.xaml:

      <FontImage x:Key="IconSignIn"
           FontFamily="FontAwesome"
           Size="22"
           Color="{StaticResource LaticreteColor}"
           Glyph="{x:Static local:IconFont.SignInAlt}"/>
<FontImage x:Key="IconSignOut"
           FontFamily="FontAwesome"
           Size="22"
           Color="{StaticResource LaticreteColor}"
           Glyph="{x:Static local:IconFont.SignOutAlt}"/>  

В гамбургер-меню текст всегда «Войти», и после изменения _loginText MenuItem выглядит так же.

И значок вообще не появляется. Чего не хватает?

ДОБАВЛЕН:

Вот сгенерированное свойство:

           /// <inheritdoc cref="_loginText"/>
    [global::System.CodeDom.Compiler.GeneratedCode("CommunityToolkit.Mvvm.SourceGenerators.ObservablePropertyGenerator", "8.0.0.0")]
    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
    public string LoginText
    {
        get => _loginText;
        set
        {
            if (!global::System.Collections.Generic.EqualityComparer<string>.Default.Equals(_loginText, value))
            {
                OnLoginTextChanging(value);
                OnPropertyChanging(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangingArgs.LoginText);
                _loginText = value;
                OnLoginTextChanged(value);
                OnPropertyChanged(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedArgs.LoginText);
            }
        }
    }

0 ответов

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