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

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 中设置它。它说该属性不存在。我的 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" />

设置掩码的代码完美运行。我认为我已经复制了所有所需的内容。令人困惑的是,为什么我不能添加另一个属性。

如果有关系的话,这是我编写的此代码的变体:如何定义文本框输入限制?

编辑:

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

我不知道那是否是一个打字错误,但你应该在那里写 set { SetValue(PassColorProperty, value);} - Patryk Ćwiek
这是事实,但这并不改变其他问题。 - Nathan Tornquist
可能是因为在b:ColorMasking.PassColor="99FF99"中你漏掉了一个'#'符号? - LPL
不行。ColorMasking.PassColor和PassColor偏好设置是不可用的。我的颜色转换代码可以处理各种十六进制字符串。 - Nathan Tornquist
1个回答

3
您发布的代码显示您正在注册一个附加属性,因此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访问器的签名必须是: public static object Get PropertyName (object target ) - 目标对象可以在你的实现中指定为更具体的类型。例如,DockPanel.GetDock方法将参数类型更改为UIElement,因为该附加属性仅应设置在UIElement实例上。 - 返回值可以在你的实现中指定为更具体的类型。例如,GetDock方法将其类型更改为Dock,因为该值只能设置为该枚举。
设置访问器: - SetPropertyName访问器的签名必须是: public static void Set PropertyName (object target , object value ) - 目标对象可以在你的实现中指定为更具体的类型。例如,SetDock方法将其类型更改为UIElement,因为该附加属性仅应设置在UIElement实例上。 - 值对象可以在你的实现中指定为更具体的类型。例如,SetDock方法将其类型更改为Dock,因为该值只能设置为该枚举。请记住,此方法的值是来自XAML加载程序的输入,当它在标记中的附加属性用法遇到您的时候。该输入是在标记中作为XAML属性值指定的值。因此,必须有类型转换、值序列化器或标记扩展支持你使用的类型,以便可以从属性值创建适当的类型(最终只是字符串)。

我在上面添加了一个编辑。如果我更改这两个属性使它们为Register,我仍然无法从我的XAML访问它们。只有Mask和MaskExpression出现。 - Nathan Tornquist
抱歉,我没有注意到帖子中的XAML。 您需要将它们用作附加属性,并使用我在第一个代码块中编写的getter和setter。 - evanb
太棒了!一切都正常运行。不过这让我感到困惑,因为看你的代码示例,PassColor与我尝试用属性设置的变量名称相同。SetPassColor和GetPassColor的名称不同。Visual Studio是寻找SetXXXXX和GetXXXXX还是这些函数只是一般形式而已? - Nathan Tornquist
它正在寻找那些特定的静态方法。我已经编辑了我的答案,删除了DependencyProperty部分,并注明了访问器签名。 - evanb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接