【问题标题】:WPF: instances of usercontrol share dependency propertiesWPF:用户控件的实例共享依赖属性
【发布时间】:2011-02-09 15:28:40
【问题描述】:

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

这是我的依赖属性:

    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:你能解释一下为什么你的依赖属性是“共享的”吗?您发布的代码看起来是正确的,没有更多示例,我不确定您遇到了什么问题。
  • 嗨,这是我的问题:当我用这个组件的更多实例启动窗口时,只有最后创建的实例会改变依赖属性。他们中的其他人看到由最后一个实例设置的值,但无法设置此属性。没有例外或其他的东西它只是不起作用。
  • 对不起,我的错。问题出在其他地方,我已经解决了,但是真的很奇怪。

标签: wpf dependency-properties


【解决方案1】:

依赖属性本身必须是静态的,与单个实例没有联系。这也适用于它的回调(在您的情况下为 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 的工作方式与任何其他属性完全一样,只是有一些额外的功能:值继承、投标、动画......

【讨论】:

  • 我想我明白这一点,但必须有办法做到这一点。文本框上的 FontSize 属性怎么样。它是如何完成的?我需要为这个属性设置动画,因此我在依赖属性中搜索。
  • FontSize 的定义就像我发布的那样。我用解释编辑了帖子。别担心,试试我发布的内容。它有效:)
  • OP 正在一个静态构造函数中初始化——这应该没有什么问题。不会按实例调用静态构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多