You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF窗口Title绑定未更新问题求助

WPF窗口Title绑定不更新的修复方案

你的代码里有两个关键问题导致窗口Title无法同步更新:

  1. IsUnsaved属性的通知参数错误
    在IsUnsaved的setter方法中,触发PropertyChanged时用了nameof(_isUnsaved)(私有字段名),但WPF绑定系统监听的是公共属性名IsUnsaved,这会导致IsUnsaved变化时,依赖它的计算属性无法收到更新通知。

  2. 计算属性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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:55:12