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

マスクを設定するためのコードは完全に機能します。必要なものも全部コピーしたと思います。別のプロパティを追加できない理由については混乱しています。

重要な場合、これは私がこのコードについて書いたバリエーションです:TextBox入力制限を定義する方法は?

編集:

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を除いて、添付プロパティのアクセサーについて説明しています。

GetAccessor

GetPropertyNameアクセサーの署名は次のとおりである必要があります。

public static object Get PropertyName(オブジェクトターゲット)

-ターゲットオブジェクトは、実装でより具体的なタイプとして指定できます。たとえば、DockPanel.GetDockメソッドは、パラメータをUIElementとして入力します。これは、添付されたプロパティがUIElementインスタンスにのみ設定されることを目的としているためです。

-戻り値は、実装でより具体的なタイプとして指定できます。たとえば、値はその列挙にのみ設定できるため、GetDockメソッドはそれをDockとして入力します。

セットアクセサー

SetPropertyNameアクセサーの署名は次のとおりである必要があります。

public static void Set PropertyName(オブジェクトターゲット、オブジェクト値)

-ターゲットオブジェクトは、実装でより具体的なタイプとして指定できます。たとえば、添付プロパティはUIElementインスタンスにのみ設定されることを目的としているため、SetDockメソッドはそれをUIElementとして入力します。

-値オブジェクトは、実装でより具体的なタイプとして指定できます。たとえば、値はその列挙にのみ設定できるため、SetDockメソッドはそれをDockとして入力します。このメソッドの値は、マークアップの添付プロパティの使用法で添付プロパティに遭遇したときにXAMLローダーからの入力であることに注意してください。その入力は、マークアップでXAML属性値として指定された値です。したがって、属性値(最終的には単なる文字列)から適切な型を作成できるように、使用する型に対して型変換、値シリアライザー、またはマークアップ拡張のサポートが必要です。

于 2012-05-25T17:09:12.270 に答える