4

我有以下声明:

public static readonly DependencyProperty PassColorProperty = DependencyProperty.RegisterAttached("PassColor",
            typeof(string),
            typeof(ColorMasking),
            new PropertyMetadata("#FFCCFF"));

    public string PassColor
    {
        get { return (string)GetValue(PassColorProperty); }
        set { SetValue(PassColorProperty, value); }
    }

目前这段代码无法编译,因为我没有在我的类中添加 : DependencyProperty。当我添加该代码时,它说字符串 PassColor 无效。

根本没有字符串,代码编译,我可以设置从该类中读取属性。我无法从我的 XAML 中设置它。它说该属性不存在。我的xml是:

<TextBox Grid.Column="1" Grid.Row="8" Margin="3" Width="Auto" Height="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
                b:ColorMasking.Mask=" ... Long Regex Command ... "
                b:ColorMasking.PassColor="99FF99" />

设置掩码的代码完美运行。我想我也复制了所有需要的东西。为什么我不能添加另一个属性令人困惑。

如果重要的话,这是我编写的这段代码的变体:如何定义文本框输入限制?

编辑:

public class ColorMasking : DependencyObject
{
    private static readonly DependencyPropertyKey _maskExpressionPropertyKey = DependencyProperty.RegisterAttachedReadOnly("MaskExpression",
            typeof(Regex),
            typeof(ColorMasking),
            new FrameworkPropertyMetadata());

    /// <summary>
    /// Identifies the <see cref="Mask"/> dependency property.
    /// </summary>
    /// 
    public static readonly DependencyProperty PassColorProperty = DependencyProperty.Register("PassColor",
            typeof(string),
            typeof(ColorMasking),
            new PropertyMetadata("#99FF99"));

    public static readonly DependencyProperty FailColorProperty = DependencyProperty.Register("FailColor",
            typeof(string),
            typeof(ColorMasking),
            new PropertyMetadata("#FFCCFF"));

    public static readonly DependencyProperty MaskProperty = DependencyProperty.RegisterAttached("Mask",
            typeof(string),
            typeof(ColorMasking),
            new FrameworkPropertyMetadata(OnMaskChanged));
4

1 回答 1

3

您发布的代码显示您正在注册AttachedProperty,因此 PassColorProperty 不是 ColorMasking 类的 DependencyPropery。它必须通过一个设置了附加属性的对象来访问。附加属性将允许您在其他对象上设置该属性,而不仅仅是

    public static void SetPassColor(DependencyObject obj, string passColor)
    {
        obj.SetValue(PassColorProperty, passColor);
    }

    public static string GetPassColor(DependencyObject obj)
    {
        return (string)obj.GetValue(PassColorProperty);
    }

除了MSDN之外,这解释了附加属性的访问器:

获取访问器

GetPropertyName 访问器的签名必须是:

公共静态对象获取PropertyName(对象目标)

- 可以在您的实现中将目标对象指定为更具体的类型。例如,DockPanel.GetDock 方法将参数类型为 UIElement,因为附加的属性只打算在 UIElement 实例上设置。

- 可以在您的实现中将返回值指定为更具体的类型。例如,GetDock 方法将其键入为 Dock,因为该值只能设置为该枚举。

设置访问器

SetPropertyName 访问器的签名必须是:

public static void Set PropertyName(对象目标,对象值)

- 可以在您的实现中将目标对象指定为更具体的类型。例如,SetDock 方法将其键入为 UIElement,因为附加的属性只打算在 UIElement 实例上设置。

- 值对象可以在您的实现中指定为更具体的类型。例如,SetDock 方法将其键入为 Dock,因为该值只能设置为该枚举。请记住,此方法的值是来自 XAML 加载器的输入,当它在标记中的附加属性用法中遇到您的附加属性时。该输入是在标记中指定为 XAML 属性值的值。因此,您使用的类型必须有类型转换、值序列化器或标记扩展支持,以便可以从属性值(最终只是一个字符串)创建适当的类型。

于 2012-05-25T17:09:12.270 回答