【问题标题】:WPF Controls and DependencyProperty on Custom ControlsWPF 控件和自定义控件上的 DependencyProperty
【发布时间】:2012-07-20 19:43:46
【问题描述】:

我有一个 C# 自定义 WPF 控件。我在控件上有基于 DependencyProperty 的属性。

public static readonly DependencyProperty CurrentStateProperty = 
 DependencyProperty.Register( "CurrentState", typeof(ControlStateEnum),
 typeof(MyCustomControl), new PropertyMetadata(ControlStateEnum.Started));

public ControlStateEnum CurrentState
{
    get { return (ControlStateEnum) GetValue(CurrentStateProperty); }
    set { SetValue(CurrentStateProperty, value); }
}

现在,如果我使用控件,并尝试使用它,唉:

<myControls:MyCustomControl CurrentState="Loaded" />

CurrentState 永远不会设置为“已加载”并保持“已启动”。我想让它能够绑定,但也能够在没有绑定的情况下设置......有什么我不明白或遗漏的东西吗?

当我在设置器上设置断点时,它不会在窗口加载时更新。

【问题讨论】:

  • 因此,在控件初始化和加载之后,最终值是从 XAML 设置在控件上的。所以处理它的方法是在DependencyProperty上添加一个PropertyChangedHandler。感谢您帮助诊断它,parapura。

标签: c# wpf dependency-properties


【解决方案1】:

您确定在控件加载后没有在其他地方更改枚举,因为这应该可以按预期工作

【讨论】:

  • 不幸的是,setter 似乎根本没有被触发。
  • 它不会...不会初始化
  • 该值确实得到更改和更新。不幸的是,这发生在控件加载和构造之后。正如另一个链接所暗示的,Setters/Getters 是通过 Get/SetValue 调用的,我们没有看到它发生变化。因此,处理更改并在 XAML 中捕获更改的唯一方法是使用回调。
  • 每一句我都说是的。我在这里没有看到问题
  • 当你写new PropertyMetadata(ControlStateEnum.Started))时,表示无论你在构造控件时什么时候都启动了默认值。然后这个CurrentState="Loaded" 覆盖它。这就是所有 WPF 控件的工作方式
【解决方案2】:

因此,最终在控件初始化和加载后,从 XAML 为控件设置了值。所以处理它的方法是在 DependencyProperty 上添加一个 PropertyChangedHandler。

parapura 有一个指向正确答案的链接 (http://stackoverflow.com/questions/4225373/setters-not-run-on-dependency-properties)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多