WPF:用户控件的实例共享依赖属性

3

我制作了一个用户控件,它的功能很好,但是当我在同一个窗口中放置两个该控件实例时,只有最后一个能正常工作。我尝试寻找解决方案并意识到依赖属性是共享的,但我不知道如何使其正常工作。

以下是我的依赖属性:

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

@user:你能更详细地解释一下为什么你的依赖属性是“共享”的吗?你发布的代码看起来正确,但如果没有更多的示例,我不确定你遇到了什么问题。 - Dan Puzey
你好,这是我的问题:当我使用更多的实例启动窗口时,只有最后创建的实例会更改依赖属性。其余的实例看到了由最后一个实例设置的值,但无法设置此属性。没有异常或其他任何东西,它只是不起作用。 - JanSkalicky
对不起,是我的错。问题出在其他地方,我已经解决了,但它确实很奇怪。 - JanSkalicky
1个回答

2
该依赖属性本身必须是静态的,没有与单个实例相关的绑定。对于其回调函数(在您的情况下为OnAnimationVerticalOffsetChanged),也适用于此 - 这些必须是静态方法(不用担心,对象实例通过其参数传递,您只需要进行一些类型转换以确保对象是您正在使用的类型)。
您应该使用静态初始化器来初始化DP,您使用的方法(在构造函数中初始化)可以工作,但是DP将被每个实例覆盖。
请参见此问题以深入了解:链接 编辑:
更正后的代码:
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(依赖属性)定义是静态的,而不是属性值本身!DPs的工作方式与任何其他属性完全相同,只是具有一些额外的功能:值继承、绑定、动画...

我觉得我理解了这个,但一定有方法来做到这一点。文本框上的FontSize属性怎么样?它是如何实现的?我需要对此属性进行动画处理,因此我正在查找依赖属性。 - JanSkalicky
FontSize的定义就像我发布的那样。我已经编辑了帖子并附上了解释。不用担心,只需尝试我发布的内容。它是有效的 :) - Matěj Zábský
OP正在静态构造函数中初始化 - 这样做应该没有任何问题。静态构造函数不是按实例调用的。 - Dan Puzey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接