มุมมอง WPF ไม่อัปเดตแม้ว่าจะใช้ INotifyPropertyChanged (.NET 5.0) [ซ้ำ]

Jan 05 2021

ในมุมมองของฉันฉันมี ProgressBar ซึ่งเชื่อมโยงกับคุณสมบัติ "Progress" ในโมเดลมุมมองของฉัน viewmodel ใช้ INotifyPropertyChanged และเมื่อคุณสมบัติถูกเปลี่ยน OnPropertyChanged () จะถูกเรียก

การผูกจะทำงานอย่างไรก็ตามมุมมองไม่ค่อยอัปเดตความคืบหน้าของตัวควบคุม ProgressBar จะอัปเดตเป็นประจำเมื่อฉันลากหน้าต่างไปรอบ ๆ ด้วยเมาส์

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));
    }
}

ฉันใช้ INotifyPropertyChanged มากและโดยปกติจะไม่เคยมีปัญหากับมัน แต่ฉันไม่เห็นปัญหาที่นี่

มีข้อเสนอแนะวิธีแก้ไขปัญหานี้อย่างไร

คำตอบ

2 soaringmatty Jan 05 2021 at 21:26

การแทนที่System.Threading.Timerด้วย a DispatcherTimer(with DispatcherPriority.Normal) ช่วยแก้ปัญหาได้

ขอขอบคุณสำหรับคำแนะนำของคุณ