我有以下声明:
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));
答案 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属性的值 标记中的值。因此必须有类型转换,值 序列化程序,或对您使用的类型的标记扩展支持,例如 可以从属性值创建适当的类型 (这最终只是一个字符串)。