WPF: не удается привязать к свойству зависимости в пользовательском элементе управления

Почему я не могу привязать к свойству зависимости в моем UserControl? Я вижу только строку "Test" в качестве значения по умолчанию, но привязка не выполняется в тестовом приложении. если я делаю ту же привязку в тестовом приложении в объекте textblock, чем он работает. поэтому проблема должна быть в классе myItem с зависимостью свойства.

Код:

public partial class myItem : UserControl, INotifyPropertyChanged
{
    public static DependencyProperty HeaderProperty =
            DependencyProperty.Register("Header", typeof(String), typeof(myItem), new UIPropertyMetadata("Test"));

    public myItem()
    {
        InitializeComponent();
        DataContext = this;
    }

    public String Header
    {
        get
        {
            return (String)GetValue(HeaderProperty);
        }
        set
        {
            SetValue(HeaderProperty, value);
            OnPropertyChanged("Header");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

1 ответ

Свойство зависимостей уже обрабатывает уведомления об изменениях, поэтому вам не нужно явно реализовывать INotifyPropertyChanged. Таким образом, вы можете удалить OnPropertyChanged("Header"); от сеттера

Если вы хотите вызвать функцию при изменении этого свойства, правильный способ - определить ее в свойстве Dependency:

 public static DependencyProperty HeaderProperty =
            DependencyProperty.Register("Header", typeof(String), typeof(myItem), new PropertyMetadata("Test", OnHeaderChanged));

    public String Header
        {
            get
            {
                return (String)GetValue(HeaderProperty);
            }
            set
            {
                SetValue(HeaderProperty, value);
            }
        }

    private void OnHeaderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){ //do something}
Другие вопросы по тегам