我正在尝试将Title
的{{1}}属性绑定到此Window
的自定义属性。 XAML看起来像这样:
Window
背后的代码如下:
Title="{Binding Path=WindowTitle, RelativeSource={RelativeSource Mode=Self}}"
在将属性public string WindowTitle
{
get
{
string title = (string)GetValue(WindowTitleProperty);
title = string.IsNullOrEmpty(title) ? "Editor" : title;
return title;
}
set
{
SetValue(WindowTitleProperty, value);
}
}
public static readonly DependencyProperty WindowTitleProperty =
DependencyProperty.Register("WindowTitle", typeof(string), typeof(Editor), new UIPropertyMetadata(null));
设置为新值后,此方法很有效。但不幸的是,在加载WindowTitle
时,我没有得到任何标题。甚至没有调用Window
的吸气剂。据我所知,它永远不会被召唤。我究竟做错了什么?为什么从未调用过getter(即使标题设置正确)?我可以通过其他方式设置默认值吗?
答案 0 :(得分:2)
你的财产看起来很奇怪。为什么它首先被定义为依赖属性?您也可以使用CLR属性并实现INotifyPropertyChanged
接口。这对我来说很好:
public partial class Window13 : Window, INotifyPropertyChanged
{
public Window13()
{
InitializeComponent();
}
private string _windowTitle = "default title...";
public string WindowTitle
{
get { return _windowTitle; }
set { _windowTitle = value; NotifyPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
依赖项属性的CLR getter应该只调用GetValue
方法而不包含任何其他逻辑。
修改强> 如果由于某种原因确实需要依赖属性,则应该像这样实现:
public string WindowTitle
{
get
{
return (string)GetValue(WindowTitleProperty);
}
set
{
SetValue(WindowTitleProperty, value);
}
}
public static readonly DependencyProperty WindowTitleProperty =
DependencyProperty.Register("WindowTitle", typeof(string), typeof(Editor), new UIPropertyMetadata("Editor"));
请注意,在注册属性时指定默认值。