La vista de WPF no se actualiza aunque se implementa INotifyPropertyChanged (.NET 5.0) [duplicado]
En mi opinión, tengo un ProgressBar que se une a una propiedad "Progreso" en mi modelo de vista. El modelo de vista implementa INotifyPropertyChanged y cuando se cambia la propiedad, se llama a OnPropertyChanged ().
El enlace funciona, sin embargo, la vista rara vez actualiza el progreso del control ProgressBar. Solo se actualiza periódicamente cuando arrastro la ventana con el mouse.
MainWindow.xaml
<Window
x:Class="WpfTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfTest"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="500"
Height="500"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Grid>
<ProgressBar Value="{Binding Progress}"/>
</Grid>
</Window>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
}
MainWindowViewModel.cs
class MainWindowViewModel : INotifyPropertyChanged
{
private readonly Timer updateProgressBarTimer;
private int progress;
public int Progress
{
get => progress;
set
{
this.progress = value;
OnPropertyChanged();
}
}
public MainWindowViewModel()
{
updateProgressBarTimer = new Timer(OnUpdateProgressBarTimerTick, null, 0, 50);
}
private void OnUpdateProgressBarTimerTick(object state)
{
this.Progress += 2;
if (this.Progress > 100)
this.Progress -= 100;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
He usado INotifyPropertyChanged mucho y, por lo general, nunca tengo problemas con él, pero no puedo ver el problema aquí.
¿Alguna sugerencia de cómo solucionar este problema?
Respuestas
Reemplazar el System.Threading.Timer
con un DispatcherTimer
(con DispatcherPriority.Normal
) resolvió el problema.
Gracias por tus sugerencias