将Control / Window属性绑定到自定义属性并设置默认值

时间:2017-06-09 10:30:23

标签: c# wpf data-binding

我正在尝试将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(即使标题设置正确)?我可以通过其他方式设置默认值吗?

1 个答案:

答案 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"));

请注意,在注册属性时指定默认值。