มุมมอง WPF ไม่อัปเดตแม้ว่าจะใช้ INotifyPropertyChanged (.NET 5.0) [ซ้ำ]
ในมุมมองของฉันฉันมี 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
การแทนที่System.Threading.Timer
ด้วย a DispatcherTimer
(with DispatcherPriority.Normal
) ช่วยแก้ปัญหาได้
ขอขอบคุณสำหรับคำแนะนำของคุณ