【问题标题】:Bind Control/Window property to custom property and set default value将 Control/Window 属性绑定到自定义属性并设置默认值
【发布时间】:2017-06-09 10:30:22
【问题描述】:

我正在尝试将WindowTitle 属性绑定到此Window 的自定义属性。 XAML 如下所示:

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 时,我没有得到任何标题。 WindowTitle 的吸气剂甚至没有被调用。据我所知,它永远不会被调用。我究竟做错了什么?为什么永远不会调用 getter(即使标题设置正确)?我可以通过其他方式设置默认值吗?

【问题讨论】:

标签: c# wpf data-binding


【解决方案1】:

您的财产看起来很奇怪。为什么将其定义为依赖属性?您不妨使用 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"));

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

【讨论】:

  • 设置默认值对我来说是缺少的部分,谢谢。只是为了学习一些东西:在窗口上实现INotifyPropertyChanged 是一种好习惯吗?
  • 并非如此。您通常将窗口的 DataContext 设置为实现 INotifyPropertyChanged 的​​视图模型类,然后绑定到视图模型的属性。但是任何类,包括窗口,都可以在有意义的情况下实现 INotifyPropertyChanged。
  • 对于这个窗口,我使用与 MainWindow 相同的 ViewModel。我需要访问该 ViewModel 的某些组件,但不想将 MainWindow 以外的其他 Windows 中的东西放入其中。我想我应该为子窗体实现一个单独的 ViewModel,然后它可以访问 MainWindow ViewModel。感谢您的帮助!
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多