8

WPF の論理ツリーとビジュアル ツリーの外側にあるビジュアル要素に動的動作をバインドしようとしています。

私の問題は、RadChart プロットの色が (準パス) で指定されることです: RadChart.SeriesMapping.LineSeriesDefinition.Appearance.Stroke

私はもともと、それを XAML のチャート データ コンテキストのプロパティにバインドしたいと考えていました。素朴に、通常の {Binding PlotBrush} を書きました

コンパイラが「支配する FrameWork 要素が見つかりません」というエラーを返しました。読んだ後、これは、階層を上るデータコンテキストの解決が機能しなかったことを意味すると思います。その祖先 (XAML で言えば) には、FrameWorkElement 以外の型と、コンテンツ コントロールのコンテンツ以外の関係があるためです。少なくとも、それが私の現在の理解です。私を修正してください。

それで、「DataContext Bridge」 http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspxを見つけました

簡単に言えば、実行時に datacontext (それを継承するものではない) が割り当てられるフレームワーク要素datacontext プロパティを、 resources 内の FrameWorkElement インスタンスのdatacontext にバインドすることを意味します。次に、同じリソース オブジェクト インスタンスを使用して、DataContext 継承ダイナミックに「アタッチ」する「ブランチ」の datacontext プロパティにバインドします。しかし、この記事の著者には、観測されたプロパティの検証ルール コンシューマーを実装できるという贅沢がありました。SolidColorBrush は封印されており、デコレータを使用しても、完全な Brush を実装するのはかなりの作業になると思います。

私の場合、これは私がやりたいことをするのに役立ちませんが、私は「とても近い」です。ですから、XAML トリックのいくつかの側面が私を助けてくれるのではないかと思います。

<Window.Resources>
    <local:FrameWorkElement x:Key="DataContextBridge"/>
</Window.Resources>

ただし、これをどのように使用するかは不明です。データコンテキストを設定するオブジェクトがありません。AppearanceSettings は FrameWorkElement ではありません。

<telerik:SeriesAppearanceSettings>
   <telerik:SeriesAppearanceSettings.Stroke>
       Ok, how do I use the fact that I can access the datacontext here?                                         
   </telerik:SeriesAppearanceSettings.Stroke>
</telerik:SeriesAppearanceSettings>

それで、次のステップは、どうにかしてブラシ オブジェクトを直接取得できるかどうかでした。私はこの種のことを試してみました.

.cs :

public class ObservableBrush : FrameworkElement
{
    public Brush Brush
    {
        get { return (Brush) GetValue(BrushProperty); }
        set { SetValue(BrushProperty, value); }
    }

    public static readonly DependencyProperty BrushProperty =
        DependencyProperty.Register("Brush", typeof (Brush), typeof (ObservableBrush), new UIPropertyMetadata(new SolidColorBrush(Colors.Black)));
}

XAML の上部:

<Window.Resources>
    <local:ObservableBrush x:Key="StrokeBrush"/>
</Window.Resources>

インライン XAML:

<telerik:SeriesAppearanceSettings.Stroke>
     <Binding Path="Brush">
     <Binding.Source>
          <Binding Source="{StaticResource ResourceKey=StrokeBrush}" Path="DataContext"/>
     </Binding.Source>                                            
     </Binding>                                     
</telerik:SeriesAppearanceSettings.Stroke>

「バインディング」はフレームワーク要素ではなく、「ソース」も依存関係プロパティではないため、もちろんランタイムは文句を言います。Brush プロパティは、依存関係プロパティの登録で指定された既定値以外を返すことはありません。

私は、この問題について2日目からまっすぐ進んでいます。次の 2 つの試みは次のとおりだと思います。 * ObservableBrush を実際のブラシにします。次に、プログラムで設定します (代わりに、標準の動的リソース バインディングを効果的に使用します)。私はそれが気に入りません。データバインディングを機能させたかったのです。* DATACONTEXT の代わりに BRUSH をブリッジします。

この XAML 部分は正常に動作します。

<telerik:SeriesAppearanceSettings.Stroke>
     <Binding Source="{StaticResource ResourceKey=StrokeBrush}" Path="Brush"/>
</telerik:SeriesAppearanceSettings.Stroke>

繰り返しになりますが、Brush を DataContext プロパティにバインドするにはどうすればよいでしょうか? ObservableBrush 内で使用して、Brush を datacontext 内のものに動的に追従させるオーバーライドはありますか?

ツリー内に偽の視覚要素を作成し、それに 2 つのバインディングを関連付けてみませんか?

<!-- Within the visual tree scope -->
<SomeFrameWorkElementType>
     <SomeFrameWorkElemetType.SomeBrushProp>
         <Binding Source="{StaticResource ResourceKey=StrokeBrush}" Path="Brush" Mode="OneWayToSource"/>
         <Binding Stroke/>
     </SomeFrameWorkElemetType.SomeBrushProp>
<SomeFrameWorkElementType>

そして、これはどういうわけか2つのバインディングを「接続」しますか?

または、このタイプの機能用の (非) 公式の「ヘルパー クラス」はありますか?

または、私は間違ったツリーを吠えていますか?動的リソースバインディングを介してコードビハインドでこれを解決する方が (はるかに) 良いですか?

これについてどのように進めるかについての考えや観察はありますか? 動的リソースがこれを解決する必要があるときにデータバインディングを主張する私の明らかな自己破壊性以外に。

4

1 に答える 1

13

Josh Smith の良い記事を見つけましたが、少し古くなっています。同じ人が約 1 年後に、さらに優れた記事を書きました。これは、ほとんど同じ質問をカバーしていますが、より良い回答があります

そこで彼はクラスを使用してDataContextSpyいます。私はまだあなたが達成しようとしていることを完全には理解していませんが、あなたがそれをどのように使用しているかをお見せしようとします:

<Grid><!-- this is some container where its DataContext has the PlotBrush Property-->
    <Grid.Resources>
        <spy:DataContextSpy x:Key="Spy"/>
    </Grid.Resources>
    <telerik:thisIsYourControl>
        <telerik:SeriesAppearanceSettings.Stroke>
             <Binding Source="{StaticResource Spy}" Path="DataContext.PlotBrush"/>
        </telerik:SeriesAppearanceSettings.Stroke>
    </telerik:thisIsYourControl>
<Grid>

これがお役に立てば幸いです。これまでテレリック コントロールを使用したことがないため、完全な例をコーディングすることはできませんが、これでカバーできることを願っています。

于 2011-04-13T10:03:08.710 に答える