WPF привязывает заголовок окна к свойству - PullRequest
6 голосов
/ 07 марта 2012

Я пытаюсь связать значение свойства (MyTitle) класса (MainWindow), производного от Window. Я создал свойство зависимости MyTitleProperty, реализовал интерфейс INotifyPropertyChanged и изменил метод set MyTitle для вызова события PropertyChanged, передав «MyTitle» в качестве параметров имени свойства. Я установил MyTitle на «Заголовок» в конструкторе, но когда окно открывается, заголовок остается пустым. Если я поставлю точку останова на событие Loaded, тогда MyTitle = "Title", но this.Title = "". Это, безусловно, что-то невероятно очевидное, чего я не заметил. Пожалуйста, помогите!

MainWindow.xaml

<Window
    x:Class="WindowTitleBindingTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:this="clr-namespace:WindowTitleBindingTest"
    Height="350"
    Width="525"
    Title="{Binding Path=MyTitle, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type this:MainWindow}}}"
    Loaded="Window_Loaded">
    <Grid>

    </Grid>
</Window>

MainWindow.xaml.cs:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public static readonly DependencyProperty MyTitleProperty = DependencyProperty.Register("MyTitle", typeof(String), typeof(MainWindow));

    public String MyTitle
    {
        get { return (String)GetValue(MainWindow.MyTitleProperty); }
        set
        {
            SetValue(MainWindow.MyTitleProperty, value);
            OnPropertyChanged("MyTitle");
        }
    }

    public MainWindow()
    {
        InitializeComponent();

        MyTitle = "Title";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
    }
}

Ответы [ 3 ]

22 голосов
/ 07 марта 2012
public MainWindow()
{
    InitializeComponent();

    DataContext = this;

    MyTitle = "Title";
}

Тогда вам просто нужно в XAML

Title="{Binding MyTitle}"

Тогда вам не нужно свойство зависимости.

6 голосов
/ 07 марта 2012

Во-первых, вам не нужно INotifyPropertyChanged, если вы просто хотите привязать к DependencyProperty.это было бы избыточно.

Вам также не нужно устанавливать DataContext, это для сценария ViewModel.(просматривайте шаблон MVVM всякий раз, когда у вас есть шанс).

Теперь ваше объявление свойства зависимости неверно, оно должно быть:

public string MyTitle
        {
            get { return (string)GetValue(MyTitleProperty); }
            set { SetValue(MyTitleProperty, value); }
        }

        // Using a DependencyProperty as the backing store for MyTitle.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MyTitleProperty =
            DependencyProperty.Register("MyTitle", typeof(string), typeof(MainWindow), new UIPropertyMetadata(null));

Обратите внимание на UIPropertyMetadata: оно устанавливаетзначение по умолчанию для вашего DP.

И, наконец, в вашем XAML:

<Window ...
       Title="{Binding MyTitle, RelativeSource={RelativeSource Mode=Self}}"
       ... />
4 голосов
/ 07 марта 2012
Title="{Binding Path=MyTitle, RelativeSource={RelativeSource Mode=Self}}"
...