A maneira correta de criar uma propriedade observável no mvvm é
[ObservableProperty]
private string _name;
No entanto, em certos cenários você precisa alterar o conjunto. Como fazer isso corretamente sem declarar o Public?
private double _currentProgressPct;
public double CurrentProgressPct
{
get => _currentProgressPct;
set
{
_dispatcherQueue.TryEnqueue(DispatcherQueuePriority.High, () =>
{
SetProperty(ref _currentProgressPct, value);
});
}
}
Pelo que entendi, a primeira abordagem é a correta de acordo com o mvvm, mas a última não?
Além disso, de acordo com este artigo, você precisa implementar a interface INotifyPropertyChanged. No entanto, isso é necessário ao usar [ObservableProperty]? Pelo que entendi, o kit de ferramentas da comunidade precisa que a classe seja um observableobject?
O motivo pelo qual estou fazendo as últimas perguntas é porque não parece que as ligações são liberadas ao inspecionar com o profiler de desempenho com foco na memória. De acordo com outro tópico que encontrei, isso pode ser porque INotifyProperyChanged não está implementado?
Em primeiro lugar, ObservableObject e ObservableProperty vêm do pacote CommunityToolkit.Mvvm NuGet.
Agora, em geral, você deve escolher o primeiro:
então esqueça o
_name
campo e use aName
propriedade gerada.O segundo:
está usando o DispatcherQueue para garantir que o valor será atualizado no thread da IU. Além disso, pode não ser um grande problema na maioria dos casos, mas vale a pena notar que se você definir
CurrentProgressPct
no thread da IU,CurrentProgressPct
ele será enfileirado em vez de atualizá-lo imediatamente.Se você tiver casos que não pretende atualizar
CurrentProgressPct
no thread da interface do usuário, você pode facilmente:ATUALIZAR
Não estou dizendo que você não deve usar o segundo. Há casos em que você pode precisar dele. Deixe-me mostrar outro caso: