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?