7

Expression Blend 内でのドラッグ アンド ドロップをサポートするために、作成した多数のアタッチされたビヘイビアを Blend ビヘイビアに移行しています。Blend ビヘイビアの作成者は、ビヘイビア プロパティを依存プロパティとして定義する傾向があることに気付きました。

double 型TiltBehaviourの public 依存関係プロパティ を公開する動作 を作成しました。TiltFactorExpression Blend 内でこのプロパティの値を設定できますが、「Data Binding ...」を追加するオプションはグレー表示されています。

動作プロパティにバインドできません

また、ビヘイビアが extends であることにも気付きましたDependencyObject。したがって、ビヘイビアには がなく、アタッチされている要素DataContextの を継承できません。DataContextこれは私にとって本当の弱点のように感じます!

要するに、Blend でビヘイビア依存プロパティへのバインディングを設定できず、それが を継承しない場合DataContext、なぜ依存プロパティをわざわざ使用する必要があるのでしょうか? 代わりに CLR プロパティを使用できます。

4

2 に答える 2

8

バインディングをサポートしない限り、ブレンド ビヘイビアはほとんど役に立ちません。私はあなたの傾き動作を再現し、問題なく Blend 4 でバインディングをサポートしているので、どこで間違ったのか正確にはわかりません。おそらく、私の簡単な例を再現して、セットアップの何が問題なのかを推測できます。

依存関係プロパティを使用した (非機能的な) 傾斜動作は次のとおりです。

public class TiltBehavior : Behavior<FrameworkElement>
{
    public double TiltFactor
    {
        get { return (double)GetValue(TiltFactorProperty); }
        set { SetValue(TiltFactorProperty, value); }
    }

    public static readonly DependencyProperty TiltFactorProperty =
        DependencyProperty.Register("TiltFactor", typeof(double), typeof(TiltBehavior), new UIPropertyMetadata(0.0));
}

次に、新しいウィンドウを作成し、動作をグリッドにドロップすると、Blend が次のように作成します。

<Grid>
    <i:Interaction.Behaviors>
        <local:TiltBehavior/>
    </i:Interaction.Behaviors>
</Grid>

Blend の [Data Binding...] オプションは、プロパティ タブで使用できます。

これを WPF プロジェクトと Silverlight プロジェクトの両方でテストしました。組み込みの動作、トリガー、およびアクションはすべて、依存関係プロパティを使用することでバインディングをサポートし、すべての Blend サンプルはバインディングを頻繁に使用するため、これ機能する必要があります。

実際には、 のような組み込みの動作FluidMoveBehaviorをグリッドにドロップしDurationて、依存関係プロパティである がバインドをサポートしていることを確認できます。それがうまくいかない場合、何が起こっているかわかりません。


それでは、ビヘイビアと呼ばれるこれらの奇妙な獣に対してバインドがどのように機能するかを考えてみましょう。

WPF または Silverlight プログラマーとして、私たちはFrameworkElement. これには、既定のバインディング ソースを制御するために操作できるというプロパティがあり、オーバーライドしないDataContext場合、そのプロパティはネストされた要素によって継承されます。

ただし、動作 (およびトリガーとアクション) はタイプではありませんFrameworkElementDependencyObject予想通り、最終的には から派生しています。しかし、から派生した任意のクラスでバインディングを使用できますが、この低レベルでは DependencyObject使い慣れたものがないため、バインディングでソースを提供する必要があります。それはあまり便利ではありません。DataContext

したがって、動作は (とにかく WPF 上で) から派生し、から派生しAnimatableます。クラスは、依存オブジェクトの単純さとフレームワーク要素の複雑さが交差する場所です。このクラスは、ブラシや画像ソースなどのより身近なものの基本クラスでもあります。これらのクラスは、フレームワーク要素の完全な複雑さを必要とするわけではありませんが、関連する要素に制限された方法で参加したいと考えています。AnimatableFreezableFreezableFreezable

複雑な魔法のプロセスを通じて、Freezableインスタンスは継承コンテキストを取得します。これは、インスタンスが最も密接に関連付けられているフレームワーク要素であり、デフォルトのバインディング (ソースのないバインディング) が使用される場合、代わりに関連付けられた要素のがFreezable使用されます。DataContext

実際、行動について学ぶとき、これAssociatedObjectは中心的な概念です。動作の場合、動作が関連付けられているものです。ただし、重要な点は、すべてのFreezableオブジェクトがプロキシによってDataContextそれらの を使用できることです。AssociatedObject

このすべての魔法は、Josh Smithが次のように呼んでいるものです。

つまり、Hillberg Freezable Trickにより、Blend ビヘイビアーは、関連付けられた要素のデータ コンテキストをデフォルト ソースとして使用するバインディングをサポートするということになります。その結果、ビヘイビアーのバインディングは、私たちの側で何の努力もせずに「そのまま機能する」ように見えます。このため、ビヘイビアーは何千倍も役に立ちます。

于 2011-06-14T05:54:42.717 に答える
4

編集: dainは正しいですが、人為的に作成されたDataContextにバインドすることはできますが、人々がバインドするのをどのくらいの頻度で見ましたSolidColorBrush.Colorか?SolidColorBrushがDependencyObjectを継承しているため、DataContextがない場合でも機能します。

継承コンテキストに関するこのブログ投稿を参照してください。

問題は、ビヘイビアーがアタッチされているため、ビヘイビアーは論理ツリーに表示されず、したがって、とにかくDataContextを継承しないということです。

于 2011-06-08T10:13:08.643 に答える