WPF:usercontrol共享依赖项属性的实例

时间:2011-02-09 15:28:40

标签: wpf dependency-properties

我创建了一个用户控件并且效果很好,但是当我将这个控件的两个实例放到一个窗口时,只有最后一个窗口可以工作。我试图找到解决方案,我意识到,依赖属性是共享的,但我不知道如何让它工作。

这是我的依赖属性:

    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));
    }

1 个答案:

答案 0 :(得分: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的工作方式与任何其他属性完全一样,它只是具有一些额外的功能:价值不和,出价,动画......