【问题标题】:WPF Title binding not getting updatedWPF 标题绑定未更新
【发布时间】:2022-12-04 19:05:53
【问题描述】:

我正在尝试将窗口标题绑定到自定义类的属性值。问题是更新属性时窗口的标题不会更新。

自定义类:

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(nameof(CurrentFileName)));
            }
        }
    }

    private bool _isUnsaved = false;
    public bool IsUnsaved
    {
        get => _isUnsaved;
        set
        {
            if (_isUnsaved != value)
            {
                _isUnsaved = value;
                PropertyChanged?.Invoke(this, new(nameof(_isUnsaved)));
            }
        }
    }

    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;
}

窗口标题 XAML:

Title="{Binding Path=Title, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"

窗口代码:

public partial class MainWindow : Window
{
    const string fileDialogFilter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
    readonly ILogger<MainWindow> _logger;
    ObservableWindowTitle observableTitle = new((Application.Current.FindResource("AppName") as string)!);

    public MainWindow(ILogger<MainWindow> logger)
    {
        _logger = logger;
        DataContext = observableTitle;

        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        observableTitle.CurrentFileName = "SomeFile";
    }
}

启动应用程序时正确显示标题:“Untitled - SharpNote”(AppName 是一个值为“SharpNote”的静态资源)。但是,单击该按钮时,标题不会更新(应为“SomeFile - SharpNote”)。

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

    需要通知Binding机制,计算出的属性Title可能发生了变化,需要重新评估。添加

    PropertyChanged?.Invoke(this, new(nameof(Title)));
    

    到 CurrentFileName 和 IsUnsaved 的设置器。

    顺便说一句:你的代码中的PropertyChanged?.Invoke(this, new(nameof(_isUnsaved)));是错误的;必须是PropertyChanged?.Invoke(this, new(nameof(IsUnsaved)));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 2015-12-27
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2014-04-28
      • 2012-06-18
      相关资源
      最近更新 更多