MAUI 中使用 ObservableObject 自动重置 Observable 属性

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

我是 MAUI 新手,我正在尝试使用 MVVM 模型。 我有一个 viewModel

BLEDeviceViewModel
,一个视图
MachineSelect
和一个模型
BLEDevice
。 在
MachineSelect.xaml.cs
中,我有以下代码:

public partial class MachineSelect : ContentPage
{
    public MachineSelect(BLEDeviceViewModel viewModel)
    {
        BindingContext = viewModel;
        InitializeComponent();
    }
}

BLEDeviceViewModel
的实例在
MauiProgram.cs
中创建为单例,并在创建
MachineSelect
时注入。在
BLEDeviceViewModel.cs
中,我有以下代码:

    public partial class BLEDeviceViewModel : ObservableObject
    {
        private BLEDevice _pairedDevice;

        public BLEDevice PairedDevice
        {
            get => _pairedDevice;
            set => SetProperty(ref _pairedDevice, value);
        }

        public BLEDeviceViewModel()
        {
            PairedDevice = new()
            {
                Name = Preferences.Get("PairedDeviceNAME", "Unknown"),
                UUID = Preferences.Get("PairedDeviceUUID", string.Empty)
            };
        }
    }
}

而在

BLEDevice
模型中,代码很简单:

public class BLEDevice
{
    public string Name { get; set; } = "";
    public string UUID { get; set; } = "";
}

问题是,当我启动应用程序时,

_pairedDevice
属性正确初始化,但突然重置为空值。我尝试调试,但找不到任何原因。该问题似乎发生在编译器完成创建
BLEDeviceViewModel
实例后,返回到
MachineSelect
类,并且当
InitializeComponent()
方法完成时,某些东西会调用
PairedDevice
getter 并然后直接将setter设为null。

代码非常简单,所以我正在努力寻找解决方案。

我尝试使用

INotifyPropertyChanged
而不是
ObservableObject
,但问题仍然存在。我还尝试在我的 ViewModel 和模型中使用
[ObservableProperty]
,但没有任何改变。我发现正确运行应用程序的唯一方法是在设置之前检查该值:

public BLEDevice PairedDevice
{
    get => _pairedDevice;
    set
    {
        if (value != null)
            SetProperty(ref _pairedDevice, value);
    }
}

我在文档和论坛中在线搜索,但找不到类似的内容。我的带有值检查的代码可以工作,但我不喜欢它。我确定其他地方有问题

c# mvvm dependency-injection maui observableobject
1个回答
0
投票

这是我的代码的修改部分,并且运行良好。


 get => _pairedDevice;
 set =>_pairedDevice = value;

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