2011-06-08 3 views
7

私は現在、ブレンドビヘイビアに作成したいくつかのアタッチされたビヘイビアを、Expression Blend内のドラッグアンドドロップをサポートするように移行しています。私は、Blendの動作の作成者が動作のプロパティを依存プロパティとして定義する傾向にあることに気付きました。ブレンド動作 - そのプロパティにバインドできますか?

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

cannot bind to behaviour property

私は、彼らはそれゆえ、ビヘイビアDependencyObjectを延ばすことにも気づきましたDataContextを持たないため、それらが結合している要素のDataContextを継承することはできません。これは私に本当の弱点のように感じる!

Blendのbehaviors依存関係プロパティにバインディングを設定できず、DataContextを継承しない場合、なぜ依存関係プロパティを使用するのが難しいのですか?代わりにCLRプロパティを使うことができます。

+1

これは非常に奇妙です。ブレンドのバージョンは何ですか? Blend 4 + Silverlight 4のBehaviorsの依存プロパティに要素プロパティまたはDataContextプロパティをバインドする際に問題はありません。 – dain

+0

Dain、Visual Studio内で手作業でバインドしようとしました。 TiltFactor = "{Binding}"の場合、AG_E_PARSER_BAD_PROPERTY_VALUEとなり、非依存プロパティにバインドしていることがよくあります。ビヘイビアのプロパティをバインディングするWeb上の例を指摘できますか? – ColinE

+1

正しい型の具体的なプロパティにバインドする必要があります:TiltFactor = "{Binding TiltFactor}" – dain

答えて

4

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

this blog post on the inheritance contextを参照してください。

動作は接続されているため、論理ツリーには表示されず、したがってDataContextを継承しません。

+0

+1は、継承コンテキストに関するブログ投稿です。なぜ私はそれを前に見たことがないのですか?素晴らしいもの。 – ColinE

+0

しかし、...彼らは、このブログの投稿に従って、DataContextを継承することができます:http://www.scottlogic.co.uk/blog/colin/2010/05/silverlight-multibinding-solution-for-silverlight- 4/ – ColinE

+0

この情報はドキュメントにないか、見つけにくいのが不思議です。 –

8

ブレンドの動作は、バインディングをサポートしない限りほとんど役に立たなくなります。私はあなたの傾きの振る舞いを作り直しました。問題なくブレンド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)); 
} 

それからちょうど新しいウィンドウを作成し、グリッド上に行動をドロップすると、ブレンドは、これを作成します。

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

とブレンド "データバインディング..."オプションがプロパティタブで使用できます。

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

実際にFluidMoveBehaviorのようなビルトインビヘイビアをグリッドにドロップして、依存関係プロパティであるDurationがバインディングをサポートしていることを確認できます。それが動作しない場合、私はいいえアイデアは何が起こっている!


行動と呼ばれるこれらの変な獣の結合がどのように機能するかを考えてみましょう。

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

しかし、行動(およびトリガーとアクション)はではなくFrameworkElementではありません。彼らは最終的にはDependencyObjectから派生しています。しかし、我々はクラスのバインディングをDependencyObjectから派生させることができますが、私たちのおなじみのDataContextはこの低レベルでは見つからないので、バインディングはソースを供給する必要があります。 これはあまり便利ではないです。

AnimatableおよびAnimatableからの動作は、Freezableから派生しています(WPFではとにかく)。 Freezableクラスは、依存性オブジェクトの単純さがフレームワーク要素の複雑さと交差するところです。 Freezableクラスは、ブラシやイメージソースのようなより親しみやすいものの基本クラスです。これらのクラスは、フレームワーク要素の完全な複雑さを必要としませんが、関連する要素をに限定した形で、に参加したいと考えています。複雑な魔法のような工程により

Freezableインスタンスが継承コンテキストを取得:(ソースないもの)、それらが最も密接に関連付けられているフレームワークエレメントを、そして結合デフォルトを使用する場合、Freezableは、それが関連付けられている要素のDataContextを使用代わりに。

事実、行動について学ぶとき、AssociatedObjectは中心的な概念です。振る舞いについては振舞いが付いているものです。しかし、重要な点は、すべてFreezableオブジェクトはAssociatedObjectDataContextをプロキシで使用できることです。

すべてこの魔法の呼び出しJosh Smithです:

だから、すべてこれが原因Hillberg Freezableのトリックに、ブレンドの行動が使用してバインディングをサポートすることを言ってまでつながります関連する要素のデータコンテキストをデフォルトのソースとして使用します。その結果、行動の束縛は、私たちの努力なしに「ちょうどうまくいく」ようです。ビヘイビアはこれにより数千倍も役に立ちます。

関連する問題