Зависимость Свойство, присвоенное привязкой значения, не работает

У меня есть usercontrol с свойством зависимости.

public sealed partial class PenMenu : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }         

    public bool ExpandCollapse
    {
        get
        {
            return false;
        }

        set
        {
            //code
        }
    }
public static readonly DependencyProperty ExpandCollapseProperty = DependencyProperty.Register("ExpandCollapse", typeof(bool), typeof(PenMenu), null);
//some more code
}

И присваиваю значение на странице XAML следующим образом:

<Controls:PenMenu x:Name="penMenu" Opened="Menu_Opened" 
                         ExpandCollapse="{Binding PenMenuVisible}" />

Но это не касается GET-SET части свойства ExpandCollapse в usercontrol. Поэтому я добавил bool для конвертера bool, чтобы проверить, какое значение передается с привязкой, например:

<Controls:PenMenu x:Name="penMenu" Opened="Menu_Opened" 
                         ExpandCollapse="{Binding PenMenuVisible, Converter={StaticResource booleanToBooleanConverter}}" />

И с точкой останова в конвертере, я вижу, что переданное значение верное. Какова возможная причина, которую он не присвоил свойству Dependency?

Также на странице XAML, если я говорю:

<Controls:PenMenu x:Name="penMenu" Opened="Menu_Opened" 
                         ExpandCollapse="true"/>

то он попадает в элемент GET-SET свойства ExpandCollapse в usercontrol. Я застрял. Это странно. Пожалуйста помоги.

Ответ 1

Это расстраивает, не так ли? Во-первых, включите обработчик измененного события. Вот так:

public string Title
{
    get { return (string)GetValue(TitleProperty); }
    set { SetValue(TitleProperty, value); }
}
public static readonly DependencyProperty TitleProperty =
    DependencyProperty.Register("Title", typeof(string), 
    typeof(MyControl), new PropertyMetadata(string.Empty, Changed));
private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var c = d as MyControl;
    // now, do something
}

Затем прочитайте эту статью, чтобы увидеть, что есть больше ошибок, чем только один: http://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html

Удачи!

Ответ 2

Не гарантированно запускается приемник и установщик свойства зависимостей, и, в частности, обработчик привязки WPF/XAML документирован, чтобы обойти их. Посмотрите MSDN - геттер/сеттер должен быть просто оберткой вокруг GetValue/SetValue на DependencyProperty сам по себе.

Вместо того, чтобы реагировать в настройщике вашего свойства, вы должны добавить свойство измененного обработчика в исходный вызов DependencyProperty.Register, когда вы можете действовать с новым значением.

(см. прочее questions).