Wie mache ich Bindungen in ItemContainerStyle in WinRT?

Ich versuche, eine Sammlung an ein ItemsControl zu binden, mit einem Canvas als Elementbedienfeld und mit den Canvas.Left- und Top-Eigenschaften der einzelnen Elemente, die an die Eigenschaften der Elementobjekte gebunden sind. Grundsätzlich versuche ich, die in beschriebene 2D-Datenbindung neu zu erstellendiesen Beitrag auf meinem Blog, aber diesmal in WinRT anstelle von WPF.

Da ItemsControl Ihren ItemTemplate-Inhalt in ein anderes UI-Element (im Fall von WinRT in einen ContentPresenter) einbindet und es sich um die Wrapper- / Container-Elemente handelt, die direkt im Elemente-Bedienfeld platziert werden, müssen Left und Top für diese Container festgelegt werden. Sie können sie nicht einfach in der DataTemplate festlegen. In WPF ist dies mit Bindungen im ItemContainerStyle einfach genug, z.

<ItemsControl.ItemContainerStyle>
    <Style>
        <Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
        <Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
    </Style>
</ItemsControl.ItemContainerStyle>

Aber wenn ich dasselbe in einem WinRT / XAML-Projekt versuche, erhalte ich nichts.Nicht einmal verbindliche Fehler. Wenn ich einen Wert fest codiere, funktioniert er. Wenn ich jedoch eine Bindung verwende, behält die Eigenschaft nur ihren Standardwert (Null) bei, und im Ausgabefenster werden keine Bindungsfehler angezeigt.

<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <!-- This works, so ItemContainerStyle does work in WinRT: -->
        <Setter Property="Canvas.Left" Value="200"/>
        <!-- But this silently fails, leaves Top as 0, and does not show
             any binding errors in the debugger's Output window: -->
        <Setter Property="Canvas.Top" Value="{Binding Y}"/>
    </Style>
</ItemsControl.ItemContainerStyle>

Ich habe überprüft, ob die ContentPresenter über den richtigen DataContext verfügen (d. H. Das Auflistungselement, nicht die Auflistung selbst oder etwas anderes Funky), sodass Sie der Meinung sind, dass diese Bindungen einwandfrei funktionieren würden. Aber sie scheinen nicht einmal zu bekommenausgewertet. Wenn ich eine fehlerhafte Bindung an einer anderen Stelle platziere und einen Debugbuild ausführe, werden Bindungsfehler im Ausgabefenster des Debuggers angezeigt. Wenn ich jedoch auf eine Nonsense-Eigenschaft in meinem ItemContainerStyle verweise, werden keine Bindungsfehler angezeigt.

Hier ist ein vollständigeres Beispiel, das (soweit ich weiß) in WPF einwandfrei funktionieren sollte, das jedoch alles am Ursprung in WinRT belässt:

<ItemsControl ItemsSource="{Binding Tiles}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding DataContext.Left}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle Width="80" Height="80" Fill="Gray"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Ich habe einige der exotischeren Optionen anprobiertBinding - speziellRelativeSource. Als ich benutzt habeRelativeSource TemplatedParentDas Nichtstun-Verhalten war unverändert. Als ich es jedoch benutzteRelativeSource Self, Ich habe einen verbindlichen Fehler erhalten, der besagt, dass die Eigenschaft bei Typ nicht existiertSetter! Es braucht dasSelf ein bisschen zu wörtlich.

Ich habe auch rumgespieltTemplateBinding, aber ich habe nie wirklich gewusst, wofür das verwendet werden soll, und alles, was ich bekam, waren einige unverständliche COM-Fehler (Willkommen bei WinRT, einem großen technologischen Rückschritt).

Wie kann ich entweder (a) dafür sorgen, dass die Bindungen korrekt funktionieren (gibt es noch andere Optionen?)?Binding dass ich es verwenden könnte, um es zum ordnungsgemäßen Funktionieren zu zwingen?ItemsContainer willkürlich positioniert sein auf aCanvas basierend auf Datenbindungen zu Eigenschaften der Auflistungselemente?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage