在属性上绑定MVVM社区sdk时如何使用set

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

在 mvvm 中创建可观察属性的正确方法是

  [ObservableProperty]
  private string _name;

但是,在某些情况下您需要更改设置。如何在不公开的情况下正确地做到这一点?

private double _currentProgressPct;

public double CurrentProgressPct
{
    get => _currentProgressPct;
    set
    {
        _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.High, () =>
        {
            SetProperty(ref _currentProgressPct, value);
        });
    }
}

据我了解,根据 mvvm,第一种方法是正确的,但后者不是正确的?

此外,根据this文章,您需要实现 INotifyPropertyChanged 接口。然而,使用[ObservableProperty]时有必要这样做吗?据我了解,社区工具包需要该类成为可观察对象?

我问最后一个问题的原因是因为在使用具有内存焦点的性能分析器进行检查时,绑定看起来并没有被释放。根据另一个线程,我发现这可能是因为 INotifyProperyChanged 未实现?

mvvm winui-3 community-toolkit-mvvm
1个回答
0
投票

首先,ObservableObjectObservableProperty来自CommunityToolkit.MvvmNuGet包。

现在一般来说,你应该选择第一个:

[ObservableProperty]
private string _name;

然后忘记

_name
字段并使用生成的
Name
属性。

第二个:

private double _currentProgressPct;

public double CurrentProgressPct
{
    get => _currentProgressPct;
    set
    {
        _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.High, () =>
        {
            SetProperty(ref _currentProgressPct, value);
        });
    }
}

正在使用DispatcherQueue来确保该值将在UI线程上更新。另外,在大多数情况下可能不是什么大问题,但值得注意的是,如果您在 UI 线程上设置

CurrentProgressPct
CurrentProgressPct
将被排队而不是立即更新。

如果您遇到不会在 UI 线程上更新

CurrentProgressPct
的情况,您可以轻松地:

_ = _dispatcherQueue.TryEnqueue(
        DispatcherQueuePriority.High,
        () =>
        {
            CurrentProgressPct = value;
        });
}
© www.soinside.com 2019 - 2024. All rights reserved.