4

後で静的リソースとしてバインドするために、依存オブジェクト プロパティの配列をバインド可能にする方法は?

私が今持っているコードDependencyObjectは、依存関係プロパティシステムをバイパスしているようです...

私は次のクラスを持っています:

public class ValueMarker : DependencyObject
{
    public static readonly DependencyProperty BrushProperty = DependencyProperty.Register("Brush", typeof(Brush), typeof(ValueMarker), new FrameworkPropertyMetadata(Brushes.Aqua));
    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(ValueMarker), new FrameworkPropertyMetadata(0d));
    public static readonly DependencyProperty OffsetProperty = DependencyProperty.Register("Offset", typeof(double), typeof(ValueMarker), new FrameworkPropertyMetadata(0d));

    public Brush Brush
    {
        get { return (Brush)GetValue(BrushProperty); }
        set { SetValue(BrushProperty, value); }
    }

    public double Offset
    {
        get { return (double)GetValue(OffsetProperty); }
        set { SetValue(OffsetProperty, value); }
    }

    public double Value
    {
        get { return (double)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
}

XAML では、次のようなバインディングを使用して、これらのリソース配列を作成します。

        <x:Array Type="my:ValueMarker" x:Key="plainMarks">
            <my:ValueMarker Brush="Red" Offset="-5" Value="{Binding Path=...}" />
            <my:ValueMarker Brush="Orange" Offset="-5" Value="{Binding Path=...}"/>
            <my:ValueMarker Brush="Orange" Offset="-5" Value="{Binding Path=...}"/>
            <my:ValueMarker Brush="Red" Offset="-5" Value="{Binding Path=...}" />
        </x:Array>

バインディングをデバッグしているときに、DP のセッターを削除する必要があることに気付きました。プロパティが見つからないというエラーが XAML に表示されます。XAML は DP システムを使用して値を割り当て、バインディングを有効にすることを理解していました。この場合、XAML が「通常の」プロパティを期待している場合、バインディングは不可能です。どうすればそれを機能させることができるか、誰でも教えてもらえますか?

4

1 に答える 1

2

ここで ValueMarkers をバインドできない理由は次のとおりです。

1.ウィンドウ/ユーザーコントロールのVisualTreeにありません。

2.ビジュアル ツリーの一部でなくても、DataContext を継承できる Type のオブジェクトではありません。

したがって、ValueMarkers を View DataContext のプロパティにバインドするには、まず、以下のように Freezable クラスから派生させる必要があります。

 public class ValueMarker : Freezable
    {
        //All your Dependency Properties comes here//

        protected override Freezable CreateInstanceCore()
        {
            return new ValueMarker();
        }
    }

これを行った後、以下のようにオブジェクトを単純にバインドできます。

   <my:ValueMarker x:Key="vm1" Brush="Orange" Offset="-5" Value="{Binding Path=Text1}"/>

ここで Text1 は Windows/usercontrols DataContext のプロパティです

次に、このリソースを次のように使用できます。

  <TextBox Text="{Binding Value, Source={StaticResource vm1}, StringFormat=F2}"/>

同様に、他の ValueMarkers のリソースを作成して、バインディングで使用することができます。

x:Array を作成してバインドすることはできません。単純に x:Array は visualtree に存在せず、DataContext を継承しないため、その要素もそれにアクセスできません。

要素がバインドをサポートする必要があるコレクションを引き続き使用する場合は、Freezable を継承し、DependancyProperty を公開して DataContext をキャプチャし、子要素にも設定する独自のコレクション クラスを作成する必要があります。

于 2013-10-03T04:59:48.263 に答える