2

XAMLバインディングを介して依存関係プロパティに初めてアクセスしたことを知る方法はありますか?必要なときにプロパティの値を実際に「レンダリング」できますか?

100または1000のポイントを含む可能性のあるいくつかのPointCollection依存関係プロパティを持つオブジェクト(Controlから派生したクラス)があります。各プロパティは、さまざまなタイプの形状(ポリライン、ポリゴンなど-これよりも複雑ですが、アイデアは得られます)で使用するために、ポイントをさまざまに配置できます。テンプレートを介して、さまざまなXAMLオブジェクトがTemplateBindingを使用してこれらのプロパティにアクセスします。オブジェクトがテンプレートを使用しているため、オブジェクトに使用されているXAMLシェイプがわからないため、バインドできるプロパティとバインドできないプロパティがわかりません。これらのPointCollectionは、実際に必要な場合にのみ入力したいと思います。

通常、.NETでは、プロパティのゲッターにいくつかのロジックがありますが、これらはXAMLデータバインディングによってバイパスされます。

WPFとSilverlightと互換性のあるソリューションが必要です。

オブジェクトのユーザーにとって追加の複雑さを回避するソリューションが欲しいです。


アップデート

これを行うために私が見つけた1つの方法は、ValueConvertersを使用することです。私の状況では、複数のポイントコレクションがありました。主要な部門がありました。データの通常の形状を含むプロパティ。他の領域/コンテキストで再利用するには、2つの代替形状が必要でした。

最初は3部でした。小道具。ただし、1つのプロパティ(通常の形状)を使用し、変換された値を使用して、ポイントを他の2つの目的の形状に変換することもできます。これを行うと、コントロールに1セットのポイントのみが作成されます。ポイントを2次形状に変換する費用は、使用した場合にのみ発生します。これで、メインコントロールは、コントロールでスローされる可能性のあるすべてのテンプレートをデータがどのように検索する必要があるかを予測する必要がなくなりました。これで、テンプレートデザイナーの問題になります。


アップデート2

確かに、INotifyPropertyChangedと通常のプロパティがこれを処理するための推奨される方法です。

4

2 に答える 2

3

データバインディングを有効にするために、必ずしも依存関係プロパティを使用する必要はありません。INotifyPropertyChangedただし、ソースでの変更をバインディングのターゲットに伝播する必要があるかどうかを実装する必要があります。「通常の」.NETプロパティは、おそらく次のように遅延ロードするのが簡単です。

PointCollection points

public PointCollection Points {
  get {
    return this.points ?? (this.points = CreatePoints());
  }
}

PointCollection CreatePoints() {
  // ...
}

コントロールにどのように適合するかはわかりませんがINotifyPropertyChanged、コントロールがシステムの他の部分にデータを提供するのは少し奇妙に聞こえます。おそらく、コントロールにデータをバインドさせることができるデータを含むビューモデルを作成する必要があります。

于 2009-09-23T16:31:46.137 に答える
0

私があなたの質問を言い換えれば

依存関係のプロパティが変更されたときに通知を受け取るにはどうすればよいですか?

これは正しいでしょうか?これは、「通常は.NETでは、プロパティのゲッターにいくつかのロジックがありますが、これらはXAMLデータバインディングによってバイパスされます」というフレーズから引用しています。

私が正しければ、あなたはあなた自身のプロパティ変更されたコールバックを登録することができます。それは常に呼ばれます。誰が変更バインディング、スタイル、またはトリガーを引き起こしたかは関係ありません。次のコードスニペットは、MSDNの記事「依存関係プロパティのコールバックと検証」から抜粋したものです。

public static readonly DependencyProperty CurrentReadingProperty = 

    DependencyProperty.Register(
        "CurrentReading",
        typeof(double),
        typeof(Gauge),
        new FrameworkPropertyMetadata(
            Double.NaN,
            FrameworkPropertyMetadataOptions.AffectsMeasure,
            new PropertyChangedCallback(OnCurrentReadingChanged),
            new CoerceValueCallback(CoerceCurrentReading)
        ),
        new ValidateValueCallback(IsValidReading)
    );
    public double CurrentReading
    {
      get { return (double)GetValue(CurrentReadingProperty); }
      set { SetValue(CurrentReadingProperty, value); }
    }

ここでのポイントは、OnCurrentReadingChanged()メソッドです。お役に立てれば :)。

于 2009-09-23T16:11:14.177 に答える