Datenbindung außerhalb der visual tree. Daten, Kontext, überbrückung

Ich bin versucht, binden ein dynamisches Verhalten, um ein visuelles element, das außerhalb des WPF-logischen und visuell-Bäume.

Mein problem ist, dass die RadChart Grundstück Farbe ist in (quasi Weg):
RadChart.SeriesMapping.LineSeriesDefinition.Aussehen.Schlaganfall

Ursprünglich wollte ich zu Binden, dass eine Eigenschaft des chart-datacontext im XAML-Code. Naiv, ich schrieb eine reguläre {Binding PlotBrush}

Compiler zurückgegeben "Nicht Finden können, EZB FrameWorkelement" Fehler. Nach der Lektüre oben, ich rechne damit, dass dies bedeutet, dass die Lösung der datacontext auf die Hierarchie hat nicht funktioniert. Weil seine Vorfahren (XAML gesprochen) hat andere Arten als FrameWorkElement und andere Beziehungen als Inhalt von einem Inhalt-control.
Zumindest ist das meine aktuelle Verständnis von es. Bitte korrigieren Sie mich.

So, ich fand die "DataContext-Brücke"
http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx

Einfach gesagt heißt es, dass Sie binden die datacontext-Eigenschaft des framework-element, das zur Laufzeit zugewiesen datacontext (nicht alle von denen, erbt es) zu den datacontext von einem FrameWorkElement Instanz innerhalb der Ressourcen. Dann das gleiche resource-Objekt-Instanz wird verwendet, um die Bindung an die datacontext-Eigenschaft eines "Astes", Sie möchten "Anhängen" an die DataContext-Vererbung dynamisch. Aber der Autor des Artikels hatte den Luxus, in der Lage zu implementieren, die validationrule-Verbraucher der beobachteten Eigenschaft. SolidColorBrush ist versiegelt und ich kann mir vorstellen, es wäre einiges an Arbeit zu implementieren, die eine komplette Bürste, sogar mit einem Dekorateur.

In meinem Fall nicht helfen, mir zu tun, was ich will, aber ich bin "so nah". Also ich Frage mich, ob es gibt einige Aspekte von XAML-tricks, die mir helfen könnten heraus.

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

Es ist jedoch unklar, wie ich nutzen diese. Es ist kein Objekt, dessen datacontext festgelegt werden sollten. AppearanceSettings ist nicht ein 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>

So, der nächste Schritt war, ob ich bekommen konnte, um das brush-Objekt direkt irgendwie. Ich experimentierte mit dieser Art der Sache, einfach Herumspielen:

.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)));
}

Top von XAML:

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

Inline-XAML:

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

"Bindung" ist nicht ein frameworkelement, noch ist "Quelle" ein dependencyproperty, entweder, so die Laufzeit natürlich beschwert. Ich bin mir bewusst, dass die Brush-Eigenschaft nicht immer alles zurückzugeben, was anderen als den default-Wert in der dependency property registration.

Ich bin eine Art zu gehen, am zweiten Tag gerade an diesem problem. Ich denke, dass meine nächsten zwei versuche an:
* Stellen Sie ObservableBrush eines echten Pinsels. Dann programmgesteuert es (effektiv mit standard-dynamische Ressource-Bindung statt). Ich mag es nicht. Ich wollte databinding arbeiten.
* Brücke eine BÜRSTE statt des DATACONTEXT.

XAML-Teil dieses gut funktioniert:

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

Aber wieder, wie kann ich binden Sie die Bürste an die DataContext-Eigenschaft? Gibt es eine Außerkraftsetzung, die ich verwenden können, innerhalb ObservableBrush, um Pinsel dynamisch Folgen der in der datacontext?

Wie über das erstellen eines fake-visual-element im Baum, und ordnen Sie dann mit ZWEI Bindungen an Sie?

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

Und diese irgendwie "verbinden" die beiden Bindungen?

Oder gibt es einige (un -) offizielle "helper-Klasse" für diese Art von Funktionalität?

Oder bin ich auf dem Holzweg, und (viel) bessere Lösung im code-behind durch dynamisches Ressourcen-bindend ist?

Irgendwelche Gedanken oder Beobachtungen, wie gehen über diese? Andere als auf meine offensichtliche selbst-Destruktivität für das beharren auf databinding, wenn dynamische Ressourcen sein sollte, dies zu lösen.

  • Als jemand, der wahrscheinlich ist zu beachten, DynamicResource erfordert das Objekt Baum zu..... Daher gleiche problem.
InformationsquelleAutor Tormod | 2011-04-13
Schreibe einen Kommentar