Tampilan WPF tidak memperbarui meskipun INotifyPropertyChanged diimplementasikan (.NET 5.0) [duplikat]
Dalam pandangan saya, saya memiliki ProgressBar yang mengikat properti "Progress" di viewmodel saya. Viewmodel mengimplementasikan INotifyPropertyChanged dan ketika properti diubah, OnPropertyChanged () dipanggil.
Pengikatan berfungsi namun tampilan jarang memperbarui kemajuan kontrol ProgressBar. Ini hanya diperbarui secara teratur ketika saya mengeringkan jendela dengan 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));
}
}
Saya telah sering menggunakan INotifyPropertyChanged dan biasanya tidak pernah mengalami masalah dengannya, tetapi saya tidak dapat melihat masalahnya di sini.
Ada saran bagaimana cara memperbaiki masalah ini?
Jawaban
Mengganti System.Threading.Timer
dengan DispatcherTimer
(dengan DispatcherPriority.Normal
) memecahkan masalah.
Terima kasih atas saran Anda