【问题标题】:DependencyProperty not triggeredDependencyProperty 未触发
【发布时间】:2012-03-02 00:36:21
【问题描述】:

我在我的用户控件中定义了这样的属性:

 public bool IsSelected 
 {
     get { return (bool)GetValue(IsSelectedProperty); }
     set
     {
         SetValue(IsSelectedProperty, value);
         StackPanelDetails.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
     }
 }

 public static readonly DependencyProperty IsSelectedProperty =
        DependencyProperty.Register("IsSelected", typeof (bool), typeof (ucMyControl));

但是当我在 xaml 中设置它的属性时,它想触发它(不调用 set)。

 <DataTemplate><local:ucTopicItem IsSelected="False" /></DataTemplate>

可能是什么问题?

【问题讨论】:

  • 类 ucMyControl 是否包含 ucTopicItem 对象的集合?或者他们是同一个东西?您在 ucMyControl 上注册 DP,但在 ucTopicItem 上设置它。您可能还想尝试 RegisterAttached 而不是 Register。

标签: wpf dependency-properties


【解决方案1】:

当在 XAML 中设置属性时,不会调用依赖属性的设置器。 WPF 将改为直接调用SetValue 方法。

请参阅 MSDN XAML Loading and Dependency Properties 了解为什么不调用 setter。

您必须使用属性元数据注册 PropertyChangedCallback

【讨论】:

  • 真可惜。但我想这回答了问题。
【解决方案2】:

您应该直接在依赖项属性中使用属性更改处理程序。这样可以确保在 XAML 中设置时调用它:

public static readonly DependencyProperty IsSelectedProperty =
    DependencyProperty.Register("IsSelected", typeof(bool), typeof(ucMyControl), new PropertyMetadata(false, OnIsSelectedChanged));

private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // Implement change logic
}

【讨论】:

  • 我这样做了,但仍然没有调用 OnIsSelectedChanged。
  • @Nickolodeon,您必须通过Register 中的PropertyMetadata 参数注册PropertyChangedCallback。
  • @jjrdk,它不仅仅是绑定,如果在 XAML 中访问该属性,则永远不会调用 getter 和 setter。
  • @Nickolodeon Clemens 是对的。不幸的是,完整的代码示例隐藏在代码框的右端。
  • Dan Puzey,到底是什么鬼?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多