【问题标题】:WPF Getter/Setter Not Being Called未调用 WPF Getter/Setter
【发布时间】:2013-05-23 19:22:13
【问题描述】:

我有以下代码。正在调用 PropertyChanged 事件,但未调用 getter 和 setter。我不能为我的生活明白为什么不。我有其他属性正在发生同样的事情,但正在设置值。这是一个自定义控件,如果有什么不同的话。当我在 get/set 处设置断点时,我什么也得不到。但是,propertychanged 正在返回正确的值。非常感谢任何帮助。

    /// <summary>
    /// Identifies the PlacementTarget dependency property.
    /// </summary>
    public static readonly DependencyProperty PlacementTargetProperty =
        DependencyProperty.RegisterAttached(
            "PlacementTarget",
            typeof(UIElement),
            typeof(FunctionPanel),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, PlacementTargetPropertyChanged)
        );

    /// <summary>
    /// Gets or setsthe PlacementTarget of tooltips for all child controls.
    /// </summary>
    public UIElement PlacementTarget
    {
        get { return (UIElement)GetValue(PlacementTargetProperty); }
        set { SetValue(PlacementTargetProperty, value); }
    }

    /// <summary>
    /// Sets the value of the PlacementTarget dependency property.
    /// </summary>
    /// <param name="target">Target object.</param>
    /// <param name="value">Value argument.</param>
    public static void SetPlacementTarget(DependencyObject target, UIElement value)
    {
        target.SetValue(PlacementTargetProperty, value);
    }

    /// <summary>
    /// Gets the value of the PlacementTarget dependency property.
    /// </summary>
    /// <param name="target">Target object.</param>
    public static UIElement GetPlacementTarget(DependencyObject target)
    {
        return (UIElement)target.GetValue(PlacementTargetProperty);
    }

    /// <summary>
    /// This method is called when the PlacementTarget dependency property changes value.
    /// </summary>
    /// <param name="sender">Sender object.</param>
    /// <param name="e">Event arguments.</param>
    private static void PlacementTargetPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        ToolTipService.SetPlacementTarget(sender, (UIElement)e.NewValue);
    }

其他信息

所以基本上 PlacementTargetPropertyChanged 处理得很好。我想问题是这个特定的 DP 实际上并没有传播给孩子们。这是 XAML sn-p:

<controls:FunctionPanel BetweenShowDelay="0"
                        InitialShowDelay="500"
                        IsError="False"
                        Message="MESSAGE"
                        Placement="Right"
                        PlacementTarget="{Binding RelativeSource={RelativeSource Self}}"
                        ShowDuration="60000" />

除了 PlacementTarget 之外的所有 DP 都在访问子元素。我试过删除绑定,但没有任何区别。

我正在通过使用 Snoop 检查值来验证其他 DP。我创建了一个 Int 类型的 InitialShowDelay DP。当我将该值设置为 5000 时,所有子控件都会继承该值,并且工具提示会在出现前延迟 5 秒。我可以通过在我的 PlacementTargetPropertyChanged 方法上放置一个断点来验证绑定是否发送了正确的控件。

更新 1

看来 PlacementTarget 工作正常。我的 Placement 附加属性的默认值设置为“right”,将被忽略。当我通过 XAML 设置它时,它仍然不起作用。但是,如果我将值设置为 Top、Left 或 Bottom,工具提示就会出现在正确的位置。

【问题讨论】:

  • 当发布相当多的代码更新时,只需编辑并发布在您自己的问题中。
  • 是的,我故意将其定义为附加属性。没有关于子控件的绑定语句。因为我正在设置 FrameworkPropertyMetadataOptions.Inherits,所以它应该流向孩子。我的其他附加属性没有问题,只有这个。
  • 啊,很公平。我错过了元数据信息。因此,如果此完全相同的代码适用于其他属性,只是在这里大胆猜测一下,您是否尝试过将属性的类型从 UIElement 更改为 FrameworkElement?
  • 试过但没有运气。如果我在子控件上设置相对绑定,它就没有问题。我被难住了。

标签: wpf dependency-properties


【解决方案1】:

XAML 将直接调用 SetValueGetValue 方法,这就是为什么您不应该在静态 Set/Get 方法中放置任何逻辑,而是使用属性更改处理程序。

【讨论】:

    【解决方案2】:

    SetterGetter 只是用于编码的 .NET 包装器。从 XAML 绑定时,将调用 GetXXXXSetXXX 而不是属性 GetterSetter

    你也可以访问DependencyPropertyPropertyChanged回调,每次属性改变都会调用这个函数。

    【讨论】:

      【解决方案3】:

      我找到了 getter 和 setter 似乎没有被触发的原因。在我的放置依赖属性中,我将默认值设置为 PlacementMode.Right。 WPF 忽略默认值。然后我在 XAML 中将其设置为 Placement="Right"。由于该值与默认值相同,因此再次被忽略。通过将默认值更改为 PlacementMode.Relative,我现在可以在 XAML 中成功地将值设置为“Right”。如果我愿意,这确实会阻止我使用 Relative,但我想这可以通过将我的属性转换为一个对象来解决,该对象的默认值为 null。

      【讨论】:

      • 这不是您问题的真正答案。您问为什么没有调用 getter/setter 包装器。这是由于其他两个答案所述。
      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多