【发布时间】: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