XAML 在.NET MAUI中使用AddINotifyPropertyChangedInterface进行数据绑定时出现的问题

qfe3c7zg  于 2023-09-28  发布在  .NET
关注(0)|答案(1)|浏览(180)

当使用PropertyChanged.Fody包中的[AddINotifyPropertyChangedInterface]属性时,我遇到了.NET MAUI中的数据绑定问题。
我有一个视图模型,它使用这个属性实现了INotifyPropertyChanged接口,并且我已经在视图模型和视图之间设置了数据绑定。
我遇到的问题是CheckBox和Switch控件的双向数据绑定不能正常工作。
当我直接与这些控件交互时(例如,通过切换Switch或选中/取消选中CheckBox),然后视图模型属性不会更新。
然而,当我以编程方式更新视图模型属性时(例如,通过单击执行命令的Button),控件会正确更新,直到我直接与控件交互。
感谢和问候Vijith
下面是我的代码示例:

using PropertyChanged;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace MauiApp4.MVVM.ViewModels
{
    [AddINotifyPropertyChangedInterface]
    internal class MainViewModel
    {
        public ICommand Command => new Command(command);

        public bool isSelected { get; set; }

        void command()
        {
            isSelected = !isSelected;
        }
    }

}
<?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"
             x:Class="MauiApp4.MainPage">

    <ScrollView>
        <VerticalStackLayout
            Spacing="25"
            Padding="30,0"
            VerticalOptions="Center">

            <Label Text="{Binding isSelected}"/>
            <CheckBox IsChecked="{Binding isSelected}"/>
            <Switch IsToggled="{Binding isSelected}"/>
            <Button Text="Change" Command="{Binding Command}"/>

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
using MauiApp4.MVVM.ViewModels;

namespace MauiApp4
{
    public partial class MainPage : ContentPage
    {
        int count = 0;

        public MainPage()
        {
            InitializeComponent();
            BindingContext = new MainViewModel();

        }

        
    }

}
jyztefdp

jyztefdp1#

我安装了PropertyChanged.Fody包并测试了你提供的代码,但它运行良好:
当我单击CheckBox或Switch时,其他两个(label和CheckBox/Switch)将一起改变状态。我还在MainViewModel的isSelected属性上添加了一个断点进行调试,结果是isSelected会更新。
此外,还有另一种方法可以实现:
NuGet安装CommunityToolkit.Mvvm包。然后将MainViewModel更改为:

public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    public bool isSelected;
}

然后在xaml中将isSelected更改为IsSelected

....
 <Label Text="{Binding IsSelected}"/>
 <CheckBox IsChecked="{Binding IsSelected}"/>
 <Switch IsToggled="{Binding IsSelected}"/>    
....

更新:

根据您的回复,问题的原因是VS的版本。卸载VS 2022 Preview并使用VS 2022后,问题已得到解决。

相关问题