Jak zrobić powiązania w ItemContainerStyle w WinRT?

Usiłuję powiązać kolekcję do ItemsControl, z kanwą jako panelem elementów, a z Canvas.Left i Top z każdym elementem do obiektów obiektów. Zasadniczo próbuję odtworzyć powiązanie danych 2D, które opisałem wten post na moim blogu, ale tym razem w WinRT zamiast WPF.

Ponieważ ItemsControl zawija zawartość ItemTemplate w innym elemencie UI (ContentPresenter, w przypadku WinRT), i są to elementy opakowania / kontenera, które są umieszczone bezpośrednio w panelu elementów, lewy i górny muszą być ustawione na tych kontenerach; nie możesz po prostu ustawić ich w DataTemplate. W WPF łatwo jest to zrobić za pomocą powiązań w ItemContainerStyle, np .:

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

Ale kiedy próbuję tego samego w projekcie WinRT / XAML, nic nie dostaję.Nawet błędy wiążące. Jeśli koduję wartość, działa; ale jeśli używam powiązania, właściwość po prostu pozostaje na domyślnej wartości (zero) i żadne błędy wiązania nie są wyświetlane w oknie Wyjście.

<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>

Sprawdziłem, że ContentPresentery mają poprawny DataContext (tj. Element kolekcji, a nie samą kolekcję lub coś innego funky), więc można by pomyśleć, że te powiązania będą działać dobrze. Ale nawet nie wydają sięoceniane. Jeśli umieszczę złe wiązanie w innym miejscu i uruchomię kompilację debugowania, widzę błędy wiązania w oknie wyjściowym debugera; ale jeśli odwołam się do właściwości nonsense wewnątrz mojego ItemContainerStyle, nie zostaną wyświetlone żadne błędy wiązania.

Oto bardziej kompletny przykład, który (o ile wiem) powinien działać poprawnie w WPF, ale pozostawia wszystko w WinRT:

<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>

Wypróbowałem kilka bardziej egzotycznych opcjiBinding -- konkretnieRelativeSource. Kiedy użyłemRelativeSource TemplatedParent, zachowanie typu nic nie zmieniało się. Jednak kiedy użyłemRelativeSource Self, Dostałem błąd wiązania, mówiąc, że właściwość nie istnieje na typieSetter! To bierze toSelf trochę zbyt dosłownie.

Bawiłem się też zTemplateBinding, ale tak naprawdę nigdy nie zastanawiałem się, do czego to ma być użyte, a wszystko, co dostałem, to niezrozumiałe błędy COM (witaj w WinRT, ogromny krok technologiczny wstecz).

Jak mogę (a) sprawić, aby powiązania działały poprawnie (czy są inne opcje włączone)Binding które mógłbym użyć, aby zmusić go do poprawnego działania?) lub (b) w przeciwnym razie zezwolić na elementy w moimItemsContainer do umiejscowienia dowolnie na aCanvas na podstawie powiązań danych z właściwościami elementów kolekcji?

questionAnswers(3)

yourAnswerToTheQuestion