使用值绑定分配的依赖项属性不起作用

时间:2013-11-19 19:59:54

标签: c# windows-store-apps winrt-xaml dependency-properties windows-8.1

我有一个带有依赖项属性的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}" />

但它没有在usercontrol中击中ExpandCollapse属性的GET-SET部分。 所以我添加bool到bool转换器只是为了检查通过绑定传递的值:

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

使用Converter中的断点,我看到传递的值是正确的。 它没有分配给依赖属性的可能原因是什么?

如果我说:

,也在XAML页面中
<Controls:PenMenu x:Name="penMenu" Opened="Menu_Opened" 
                         ExpandCollapse="true"/>

然后它命中usercontrol中的ExpandCollapse属性的GET-SET部分。 我被卡住了。这很奇怪。请帮忙。

2 个答案:

答案 0 :(得分:23)

令人沮丧的不是吗?首先,包括已更改的事件处理程序。像这样:

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

祝你好运!

答案 1 :(得分:5)

不保证依赖属性的getter和setter可以运行,特别是WPF绑定引擎/ XAML处理器被记录为绕过这些。看一下MSDN - getter / setter应该只是GetValue / SetValue本身的DependencyProperty / DependencyProperty.Register的包装。

当您可以对新值进行操作时,您应该在原始调用{{1}}中添加属性更改处理程序,而不是在您的属性的setter中作出反应。

(请参阅other questions)。