Frage

Ich lerne gerade alles über das Binden in WPF.Ich habe jedoch große Probleme beim Debuggen der Analysefehler in meinem XAML.Kann mir bitte jemand sagen, was mit diesem kleinen Stück nicht stimmt?:

<Border Name="TrackBackground"
    Margin="0"
    CornerRadius="2"                     
    Grid.Row="1"
    Grid.Column="1"
    Background="BlanchedAlmond"
    BorderThickness="1"
    Height="{TemplateBinding Height}">

    <Canvas Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1">
        <Thumb Name="ThumbKnob" Height="{Binding ElementName=Part_Track, Path=Height, Mode=OneWay}" />
    </Canvas>
</Border>

Es ist die Datenbindung, die unterbrochen wird.Ich bekomme eine InvalidAttributeValue Ausnahme für ThumbKnob.Height, wenn ich versuche, dies auszuführen.Ich weiß, dass mir etwas Grundlegendes entgehen muss.Melden Sie sich also bei mir, Staplerfahrer, und meine Dankbarkeit wird grenzenlos sein.


Das Ändern des ElementNamens hat nicht geholfen.Es muss noch etwas anderes sein, was ich nicht verstehe.

Ich sollte erwähnen, dass ich dies in Silverlight teste.Die genaue Meldung, die ich vom Internet Explorer erhalte, lautet:

XamlParseException: Invalid attribute value for property Height.

Das Ganze befindet sich in einem ControlTemplate.Ich erstelle einen Schieberegler, nur um mir die Konzepte beizubringen.

War es hilfreich?

Lösung

Die ElementName-Eigenschaft einer Bindung wird in Silverlight nicht unterstützt.

Wenn Sie in den Code dahinter gehen oder das Binding-Objekt im Klassen-Explorer untersuchen, werden Sie feststellen, dass es keine Eigenschaft namens ElementName hat.

Andere Tipps

Um Datenbindungen zu debuggen, füge ich normalerweise einen Konverter hinzu, mit dem ich einen Haltepunkt in VS.NET festlegen kann.

also würde die Bindung etwa so aussehen:

{Binding ElementName=PART_Track, Path=Height, Mode=OneWay, Converter={StaticResources DebugConverter}}

Dann kann der Konverter eine leere Implementierung eines IValueConverter sein, einen Haltepunkt in der Convert-Methode festlegen und sehen, auf welchen Wert die Höhe festgelegt wird ...

Vergessen Sie nicht, Ihren Konverter zu Ihren Ressourcen hinzuzufügen ...

Vielleicht ist der Wert NaN?

Ok, hier ist der Deal:

In Silverlight können Sie Werte von einem UI-Element nicht deklarativ an ein anderes binden.Die einzige Möglichkeit, das zu tun, was ich hier versucht habe, wäre der C#-Code.

Ich hatte gestern eine Referenz dazu, aber jetzt müssen Sie sich wohl einfach auf mein Wort verlassen :)

Hmm, in diesem Punkt könnte es einen erheblichen Unterschied zwischen WPF und Silverlight geben.

Ich habe anscheinend keine Probleme damit, dieses Beispiel in einem WPF-Fenster zu kompilieren und auszuführen:

<Slider Width="400" Height="20">
    <Slider.Template>
        <ControlTemplate>
            <Border Name="TrackBackground"
                Margin="0"
                CornerRadius="2"                     
                Grid.Row="1"
                Grid.Column="1"
                Background="BlanchedAlmond"
                BorderThickness="1">

                <Canvas x:Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1">
                    <Thumb Name="ThumbKnob" Height="{Binding ElementName=PART_Track, Path=Height, Mode=OneWay}" />
                </Canvas>
            </Border>
        </ControlTemplate>
    </Slider.Template>
</Slider>

Vielleicht hat Silverlight weniger Eigenschaften in der Thumb-Klasse ...

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.thumb.aspx

Zunächst einmal ist es eine Frage des Gehäuses...

Ändern

Part_Track
Zu
PART_Track
Dadurch wird Ihr Bindungsfehler behoben.

Aber ich glaube nicht, dass Sie das versuchen.

Sie könnten ein Raster anstelle einer Leinwand verwenden und die Größe der Miniaturansicht wird automatisch angepasst.Canvas hat nicht wirklich eine Höhe, da es sich nicht wirklich um die Größe seiner untergeordneten Elemente kümmert ...

Hoffe das hilft...

Ist der Rand übrigens in einer Vorlage enthalten?

Da TemplateBinding nicht erforderlich ist, wenn sich der Rahmen nicht in einer Vorlage befindet (entweder ControlTemplate oder DataTemplate).

Silverlight 3 enthält jetzt ElementName-Bindung ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top