WPF MVVM模式下TextBlock触发PropertyChanged后界面未更新问题
问题原因和修复方案
1. FontColor属性缺少属性变更通知
你手动补了DispString的PropertyChanged触发逻辑,但FontColor还是自动属性,赋值时不会通知UI更新,需要改成和DispString一致的带通知的属性:
private SolidColorBrush _fontColor; public SolidColorBrush FontColor { get => _fontColor; set { if (value != _fontColor) { _fontColor = value; OnPropertyChanged(nameof(FontColor)); } } }
2. TimedNotifyStatusUpdate方法同步阻塞UI线程
你现在的写法是启动Task后直接调用t.Wait(),如果你是在UI线程触发这个方法,会直接卡住UI线程,整个界面不会响应任何更新,等durationSec秒后错误状态、就绪状态连续变更,你看不到中间的错误提示。
需要改成异步非阻塞写法,不要用Wait阻塞调用:
public static async void TimedNotifyStatusUpdate(string error, ErrorType type, int durationSec) { LogErrorWithStatusUpdate(error, type); await Task.Delay(durationSec * 1000); ClearStatusError(); }
3. 后台线程变更属性建议调度到UI线程
虽然WPF对Freezable类型(比如SolidColorBrush)的跨线程变更做了部分兼容,但最好所有触发UI更新的属性变更都调度到UI线程执行,避免偶现的不更新问题。你可以在VM的RefreshDisp方法里加调度逻辑:
public void RefreshDisp(object sender, PropertyChangedEventArgs e) { App.Current.Dispatcher.Invoke(() => { this.DispString = SubscribedLogger.StatusString; this.FontColor = SubscribedLogger.StatusColor; }); }
4. Logger类需要补充属性变更通知
你Logger类虽然继承了INotifyPropertyChanged,但目前给StatusString、StatusColor赋值的时候没有触发PropertyChanged事件,要确保这两个属性赋值时抛事件,VM才能收到变更通知:
private string _statusString; public string StatusString { get => _statusString; set { if (_statusString != value) { _statusString = value; OnPropertyChanged(nameof(StatusString)); } } } private SolidColorBrush _statusColor; public SolidColorBrush StatusColor { get => _statusColor; set { if (_statusColor != value) { _statusColor = value; OnPropertyChanged(nameof(StatusColor)); } } } // Logger类里补充OnPropertyChanged方法 private void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
内容的提问来源于stack exchange,提问作者A Piranha
相关产品推荐
相关产品推荐

