Tampilan WPF tidak memperbarui meskipun INotifyPropertyChanged diimplementasikan (.NET 5.0) [duplikat]

Jan 05 2021

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

2 soaringmatty Jan 05 2021 at 21:26

Mengganti System.Threading.Timerdengan DispatcherTimer(dengan DispatcherPriority.Normal) memecahkan masalah.

Terima kasih atas saran Anda