La vista WPF non si aggiorna sebbene INotifyPropertyChanged sia implementato (.NET 5.0) [duplicato]
A mio avviso, ho una ProgressBar che si lega a una proprietà "Progress" nel mio viewmodel. Il viewmodel implementa INotifyPropertyChanged e quando la proprietà viene modificata, viene chiamato OnPropertyChanged ().
L'associazione funziona, tuttavia la visualizzazione aggiorna raramente lo stato di avanzamento del controllo ProgressBar. Si aggiorna regolarmente solo quando trascino la finestra con il 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));
}
}
Ho usato INotifyPropertyChanged molto e di solito non ho mai avuto problemi con esso, ma non riesco a vedere il problema qui.
Qualche suggerimento su come risolvere questo problema?
Risposte
Sostituire il System.Threading.Timer
con un DispatcherTimer
(con DispatcherPriority.Normal
) ha risolto il problema.
Grazie per i vostri suggerimenti