【问题标题】:Get or Set Accessor of Attached Property not firing on databind? WPF获取或设置附加属性的访问器未在数据绑定上触发? WPF
【发布时间】:2010-12-07 02:42:22
【问题描述】:

我有一个自定义的附加属性,但访问器永远不会在数据绑定上被访问。 这些访问器是否意味着每次附加属性更改时都可以访问?

  public static readonly DependencyProperty CharacterColumnNumberProperty =
        DependencyProperty.RegisterAttached("CharacterColumnNumber", typeof(int), typeof(DragCanvas), new UIPropertyMetadata(1));

    public static int GetCharacterColumnNumber(UIElement uiElement)
    {
        if (uiElement != null)
            return (int)uiElement.GetValue(CharacterColumnNumberProperty);
        else return 0;
    }

    public static void SetCharacterColumnNumber(UIElement uiElement, int value)
    {
        if (uiElement != null)
        {
            uiElement.SetValue(CharacterColumnNumberProperty, value);
            DragCanvas.SetLeft(uiElement, value * 10);
        }
    }

XAML:

 <Setter Property="local:DragCanvas.CharacterColumnNumber" Value="{Binding Path=CharacterColumnNumber, Mode=TwoWay}" />

【问题讨论】:

  • 绑定不访问属性——它们使用底层依赖对象和绑定框架来访问依赖属性的值。当我第一次开始摆弄DP时,这个也让我感到惊讶。 WPF 中有很多内容。
  • 为什么框架(或 xaml 编辑器)需要访问器来遵守命名约定,如果它们甚至不被 WPF 属性系统使用?

标签: wpf data-binding properties attached-properties


【解决方案1】:

不,他们不是。如果您想知道内部属性引擎何时更改这些值,请为 UIPropertyMetadata 的 PropertyChangedCallback 参数传递一个委托。

每次更改属性时都会调用此委托,无论是通过 CLR 属性还是通过依赖属性引擎内部的更改(即绑定)。

【讨论】:

  • 感谢您的回答,这是有道理的。但据我了解,附加属性是最常见的用途之一是更改布局。当 CharacterColumnNumber 更改时,PropertyChangedCallback 参数是否会为我提供更改 UIElement 的 Canvas.Left 的最佳选择?即:Canvas.Left = CharacterColumnNumber * 10。重申一下,我想将 CharacterColumnNumber 值绑定到画布上的位置。
  • 写完最后一条评论后,我想到了使用转换器,也许是更好的选择?但是,如果我不想使用转换器,上述方法是否是最好的方法?谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2015-01-22
  • 1970-01-01
  • 2010-12-20
  • 2019-03-14
相关资源
最近更新 更多