2011-02-09 139 views
3

我做了一个用户控件,它工作的很好,但是当我把这个控件的两个实例放到一个窗口中时,只有最后一个工作。我试图找到解决方案,我意识到,依赖属性是共享的,但我不知道如何得到它的工作。WPF:用户控件共享依赖项属性的实例

这里是我的依赖属性:

public double AnimatingVerticalOffset 
    { 
     get { return (double)GetValue(AnimatingVerticalOffsetProperty); } 
     set { SetValue(AnimatingVerticalOffsetProperty, value); } 
    } 

    public static readonly DependencyProperty AnimatingVerticalOffsetProperty; 

    static ListChooser() 
    { 
     ListChooser.AnimatingVerticalOffsetProperty = 
        DependencyProperty.Register("AnimatingVerticalOffset", typeof(double), typeof(ListChooser), new UIPropertyMetadata(OnAnimationVerticalOffsetChanged)); 
    } 
+0

@user:你能解释一下为什么你的依赖项属性是“共享的”吗?您发布的代码看起来正确,没有更多示例,我不确定您遇到了什么问题。 – 2011-02-10 09:54:16

+0

嗨,这里是我的问题:当我用这个组件的更多实例启动窗口时,只有最后创建的实例更改了依赖项属性。其余的看到由最后一个实例设置的值,但不能设置该属性。没有例外或其他的东西只是不起作用。 – JanSkalicky 2011-02-11 10:43:01

回答

2

依赖属性本身必须是静态的,没有联系到一个单一实例。这也适用于它的回调(OnAnimationVerticalOffsetChanged在你的情况) - 这些必须是静态方法(不要担心,对象实例通过它的参数传递,你只需要做一些类型转换来确保对象是你的类型正在合作)。

您应该使用静态初始化程序来初始化DP,您使用的方法(在构造函数中初始化)可以工作,但DP将为每个实例覆盖。

See this question for deeper explanation.

编辑:

更正代码:

public double AnimatingVerticalOffset 
{ 
    get { return (double)GetValue(AnimatingVerticalOffsetProperty); } 
    set { SetValue(AnimatingVerticalOffsetProperty, value); } 
} 

public static readonly DependencyProperty AnimatingVerticalOffsetProperty = 
       DependencyProperty.Register("AnimatingVerticalOffset", typeof(double), typeof(ListChooser), new UIPropertyMetadata(OnAnimationVerticalOffsetChanged)); 

static ListChooser() 
{ 
} 

如果回调也不是一成不变的,你会得到编译错误(=>您必须使它静态)。

编辑:

记住,DP定义是静态的,而不是属性的值本身! DP的工作原理与其他任何属性一样,它只是具有一些额外的功能:价值inheightiance,投标,动画...