WPF窗口Title绑定未更新问题求助
WPF窗口Title绑定不更新的修复方案
你的代码里有两个关键问题导致窗口Title无法同步更新:
IsUnsaved属性的通知参数错误
在IsUnsaved的setter方法中,触发PropertyChanged时用了nameof(_isUnsaved)(私有字段名),但WPF绑定系统监听的是公共属性名IsUnsaved,这会导致IsUnsaved变化时,依赖它的计算属性无法收到更新通知。计算属性Title未发送更新通知
Title是基于CurrentFileName和IsUnsaved的计算属性,当这两个依赖属性变化时,你没有触发Title的PropertyChanged事件,WPF不知道Title的值已经改变,自然不会更新窗口Title。
修复后的ObservableWindowTitle代码如下:
public class ObservableWindowTitle : INotifyPropertyChanged { public string AppName { get; } private string _currentFileName = string.Empty; public string CurrentFileName { get => _currentFileName; set { if (value is null) { throw new ArgumentNullException(nameof(value)); } if (_currentFileName != value) { _currentFileName = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CurrentFileName))); // 当CurrentFileName变化时,通知Title属性更新 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title))); } } } private bool _isUnsaved = false; public bool IsUnsaved { get => _isUnsaved; set { if (_isUnsaved != value) { _isUnsaved = value; // 修正为公共属性名IsUnsaved PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsUnsaved))); // 当IsUnsaved变化时,通知Title属性更新 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title))); } } } public string Title { get => string.Format("{0}{1} - {2}", (IsUnsaved ? "*" : string.Empty), (CurrentFileName.Length == 0 ? "Untitled" : CurrentFileName), AppName); } public event PropertyChangedEventHandler? PropertyChanged; public ObservableWindowTitle(string appName) => AppName = appName; }
修复说明:
- 把IsUnsaved setter里的
nameof(_isUnsaved)改为nameof(IsUnsaved),确保通知的是正确的属性名。 - 在CurrentFileName和IsUnsaved的setter中,更新完自身值后,额外触发Title的
PropertyChanged通知,让WPF知道计算属性Title的值已经变化。
这样修改后,点击按钮设置CurrentFileName为"SomeFile"时,窗口Title会同步更新为"SomeFile - SharpNote";当IsUnsaved设为true时,Title会自动加上*标记,比如"*SomeFile - SharpNote"。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

