Maui MVVM:最简单的模式不起作用

问题描述 投票:0回答:1

我正在使用 MVVM 模式对项目进行少量添加。

该项目有点大,但我将其精简为一个很小的示例项目,以使这里的工作变得更容易。

代码

BusyViewModel.cs

using CommunityToolkit.Mvvm.ComponentModel;

namespace MauiApp6.ViewModels
{
    public partial class BusyViewModel : ObservableObject
    {
        [ObservableProperty]
        private bool isBusy = false;
    }
}

CommandViewModel.cs

using CommunityToolkit.Mvvm.Input;

namespace MauiApp6.ViewModels
{
    public partial class CommandViewModel
    {
        private BusyViewModel busyViewModel;

        public CommandViewModel()
        {
            // Initialize BusyViewModel
            busyViewModel = new BusyViewModel();
        }

        [RelayCommand()]
        internal void Click()
        {
            // Set IsBusy to true
            busyViewModel.IsBusy = true;
        }
    }
}

主页.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:MauiApp6.ViewModels"
             x:Class="MauiApp6.MainPage" >

    <StackLayout>
        <Button Text="Click Me" 
                BindingContext="{Binding Source={vm:CommandViewModel}}"
                Command="{Binding ClickCommand}"/>

        <Label BindingContext="{Binding Source={vm:BusyViewModel}}"
               Text="{Binding IsBusy}"/>

        <ActivityIndicator BindingContext="{Binding Source={vm:BusyViewModel}}"
                           IsRunning="{Binding IsBusy}"/>
    </StackLayout>
</ContentPage>

预期结果

点击按钮后
  • ClickCommand 触发
  • 标签文本更改为“true”
  • 活动指示器开始旋转

实际结果

单击按钮后
  • ClickCommand 触发
  • 没有发生明显的变化

问题

  • 我缺少什么部分?我找不到——很可能非常微小——与网络上无数例子的区别。
c# xaml mvvm maui community-toolkit-mvvm
1个回答
0
投票

你没有正确使用你的

BindingContext
,你需要的是如下

首先,您需要将

BindingContext
分配给您的页面,一旦您将其分配为 DataType,以便它被编译并绑定到您的 XAML,其余的将自行完成

public MainPage()
{
  InitializeComponent();
  BindingContext= new CommandViewModel();
}

在您的主页 XAML 中

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:MauiApp6.ViewModels"
             x:DataType="vm:CommandViewModel"
             x:Class="MauiApp6.MainPage" >
 <StackLayout>
        <Button Text="Click Me" 
                Command="{Binding ClickCommand}"/>

        <Label Text="{Binding IsBusy}"/>

        <ActivityIndicator IsRunning="{Binding IsBusy}"/>
 </StackLayout>
</ContentPage>

另外,我不明白

BusyViewModel
的目的是什么。

© www.soinside.com 2019 - 2024. All rights reserved.