依赖属性 - 无法从XAML设置值

时间:2012-05-25 15:56:13

标签: c# wpf xaml dependency-properties masking

我有以下声明:

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设置它。它说该物业不存在。我的xaml是:

<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" />

设置Mask的代码完美无缺。我想我也复制了所有必需的东西。令人困惑的是为什么我不能添加另一个属性。

如果重要,这是我对此代码所写的变体:How to define TextBox input restrictions?

编辑:

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));

1 个答案:

答案 0 :(得分: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之外的其他内容解释了附加属性的访问者:

  

Get Accessor

     

GetPropertyName访问者的签名必须是:

     

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

     

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

     

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

     

Set Accessor

     

SetPropertyName访问者的签名必须是:

     

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

     

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

     

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