Frage

Weiß jemand, ob es möglich ist, ScaleX und ScaleY einer Rendertransformation in Silverlight 2 Beta 2 zu datenbinden?Bindungstransformationen sind in WPF möglich. Beim Einrichten meiner Bindung in Silverlight über XAML erhalte ich jedoch eine Fehlermeldung.Vielleicht ist es möglich, dies über Code zu tun?

<Image Height="60" HorizontalAlignment="Right" 
       Margin="0,122,11,0" VerticalAlignment="Top" Width="60" 
       Source="Images/Fish128x128.png" Stretch="Fill" 
       RenderTransformOrigin="0.5,0.5" x:Name="fishImage">
    <Image.RenderTransform>
         <TransformGroup>
             <ScaleTransform ScaleX="1" ScaleY="1"/>
             <SkewTransform/>
             <RotateTransform/>
             <TranslateTransform/>
         </TransformGroup>
    </Image.RenderTransform>
</Image>

Ich möchte ScaleX und ScaleY des ScaleTransform-Elements binden.

Ich erhalte einen Laufzeitfehler, wenn ich versuche, eine Bindung für eine doppelte Eigenschaft in meinem Datenkontext herzustellen:

Message="AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 1570 Position: 108]"

Meine Bindung sieht so aus:

<ScaleTransform ScaleX="{Binding Path=SelectedDive.Visibility}" 
                ScaleY="{Binding Path=SelectedDive.Visibility}"/>

Ich habe dreifach überprüft, ob der Bindungspfad korrekt ist – ich binde einen Schieberegler mit demselben Wert und das funktioniert einwandfrei ...

Die Sichtbarkeit ist vom Typ Double und eine Zahl zwischen 0,0 und 30,0.Ich habe einen Wertekonverter, der diese Zahl auf 0,5 und 1 herunterskaliert – ich möchte die Größe des Fisches abhängig von der Klarheit des Wassers skalieren.Ich glaube also nicht, dass es ein Problem mit dem Typ ist, gegen den ich bindend bin ...

War es hilfreich?

Lösung

ScaleTransform hat keinen Datenkontext, daher sucht die Bindung höchstwahrscheinlich selbst nach SelectedDive.Visibility und findet sie nicht.Es gibt vieles in Silverlight XAML und Datenbindung, das sich von WPF unterscheidet ...

Um dieses Problem zu lösen, müssen Sie die Bindung im Code einrichten** oder manuell auf das PropertyChanged-Ereignis Ihres Datenobjekts warten und die Skalierung im Code dahinter festlegen.

Ich würde Letzteres wählen, wenn Sie eine Animation/ein Storyboard für den Maßstabswechsel erstellen möchten.

** Ich muss es überprüfen, aber Sie können möglicherweise keine Verbindung herstellen.Soweit ich mich erinnere, wird die RenderTransform, wenn sie nicht Teil einer Animation ist, in eine Matrixtransformation umgewandelt und alle Wetten sind ungültig.

Andere Tipps

Ist es ein Laufzeitfehler oder ein Kompilierzeitfehler, Jonas?Mit Blick auf die Dokumentation, ScaleX und ScaleY sind Abhängigkeitseigenschaften, daher sollten Sie schreiben können

<ScaleTransform ScaleX="{Binding Foo}" ScaleY="{Binding Bar}" />

...wobei Foo und Bar vom entsprechenden Typ sind.

Bearbeiten:Das ist natürlich die WPF-Dokumentation.Ich nehme an, es ist möglich, dass ScaleX und ScaleY in Silverlight zu Standardeigenschaften und nicht zu Abhängigkeitseigenschaften geändert wurden.Ich würde gerne mehr über den Fehler erfahren, den Sie sehen.

Ah, ich glaube, ich verstehe Ihr Problem.Sie versuchen, eine Eigenschaft vom Typ Visibility (SelectedDive.Visibility) an eine Eigenschaft vom Typ Double (ScaleTransform.ScaleX) zu binden.WPF/Silverlight kann nicht zwischen diesen beiden Typen konvertieren.

Was wollen Sie erreichen?Vielleicht kann ich Ihnen mit dem XAML helfen.Was ist „SelectedDive“ und was soll passieren, wenn sich seine Sichtbarkeit ändert?

Tut mir leid, ich wollte, dass die Anzahl der Antworten steigt, daher war mir nicht klar, dass Sie die Frage mit weiteren Informationen bearbeitet haben.

OK, die Sichtbarkeit ist also vom Typ Double, daher sollte die Bindung in dieser Hinsicht funktionieren.

Könnten Sie als Workaround versuchen, Ihre ScaleX- und ScaleY-Werte direkt an das Schieberegler-Steuerelement zu binden, an das SelectedDive.Visibility gebunden ist?Etwas wie:

<ScaleTransform ScaleX="{Binding ElementName=slider1,Path=Value}" ... />

Wenn das klappt, kommt es zumindest zum Laufen.

Bearbeiten:Ah, mir ist gerade eingefallen, dass ich einmal gelesen habe, dass Silverlight die ElementName-Syntax in Bindungen nicht unterstützt, sodass das möglicherweise nicht funktioniert.

Ja, vielleicht erben die eingebetteten Rendertransformationen den DataContext nicht von dem Objekt, auf das sie angewendet werden.Können Sie den DataContext in sie hineinzwingen?Geben Sie der Transformation beispielsweise einen Namen:

<ScaleTransform x:Name="myScaler" ... />

...und dann in Ihrem CodeBehind:

myScaler.DataContext = fishImage.DataContext;

...damit der Skalierer seinen DataContext definitiv mit dem Bild teilt.

Ok, nimmt das Bild selbst den DataContext richtig auf?

Versuchen Sie Folgendes hinzuzufügen:

<Image Tooltip="{Binding SelectedDive.Visibility}" ... />

Wenn das kompiliert und ausgeführt wird, bewegen Sie den Mauszeiger über das Bild und prüfen Sie, ob der richtige Wert angezeigt wird.

Ich hatte gehofft, das Problem mit XAML zu lösen, aber es stellte sich heraus, dass Brians Vorschlag der richtige Weg war.Ich habe Matts Vorschlag verwendet, der Skalierungstransformation einen Namen zu geben, damit ich über den Code darauf zugreifen kann.Dann habe ich das Wertänderungsereignis des Schiebereglers verknüpft und die Eigenschaften ScaleX und ScaleY manuell aktualisiert.Ich habe meinen Wertekonverter beibehalten, um vom Sichtbarkeitsbereich (0-30 m) in den Maßstab (0,5 bis 1) umzuwandeln.Der Code sieht so aus:

    private ScaleConverter converter;

    public DiveLog()
    {           
        InitializeComponent();

        converter = new ScaleConverter();
        visibilitySlider.ValueChanged += new 
          RoutedPropertyChangedEventHandler<double>(visibilitySlider_ValueChanged);
    }        

    private void visibilitySlider_ValueChanged(object sender,   
                                        RoutedPropertyChangedEventArgs<double> e)
    {
        fishScale.ScaleX = (double)converter.Convert(e.NewValue, 
                                   typeof(double), null, CultureInfo.CurrentCulture);
        fishScale.ScaleY = fishScale.ScaleX;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top