Как сделать привязки в ItemContainerStyle в WinRT?
Я пытаюсь привязать коллекцию к ItemsControl, с Canvas в качестве панели элементов и с привязкой Canvas.Left и Top каждого элемента к свойствам объектов item. По сути, я пытаюсь воссоздать двумерную привязку данных, которую я описал вэтот пост в моем блоге, но на этот раз в WinRT вместо WPF.
Так как ItemsControl оборачивает содержимое ItemTemplate в другой элемент пользовательского интерфейса (ContentPresenter, в случае WinRT), и это те элементы оболочки / контейнера, которые размещаются непосредственно внутри панели элементов, в этих контейнерах должны быть установлены левый и верхний элементы. ; Вы не можете просто установить их в шаблоне данных. В WPF это достаточно легко сделать с помощью привязок в ItemContainerStyle, например:
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
<Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
Но когда я пытаюсь сделать то же самое в проекте WinRT / XAML, я ничего не получаю.Not even binding errors. Если я жестко закодирую значение, оно работает; но если я использую привязку, свойство просто остается на его значении по умолчанию (ноль), и в окне вывода не отображаются ошибки привязки.
<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>
Я проверил, что ContentPresenters имеет правильный DataContext (то есть элемент коллекции, а не саму коллекцию или что-то еще в стиле фанк), поэтому вы думаете, что эти привязки будут работать просто отлично. Но они, кажется, даже не получаютevaluated. Если я помещаю плохое связывание в другое место и запускаю отладочную сборку, я вижу ошибки связывания в окне вывода отладчика; но если я ссылаюсь на бессмысленное свойство внутри моего ItemContainerStyle, ошибки привязки не отображаются.
Вот более полный пример того, что (насколько я знаю) должно нормально работать в WPF, но это оставляет все в начале 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>
Я попробовал несколько более экзотических вариантовBinding
- конкретноRelativeSource
, Когда я использовалRelativeSource TemplatedParent
поведение бездействия было неизменным. Тем не менее, когда я использовалRelativeSource Self
Я получил ошибку привязки, сказав, что свойство не существует по типуSetter
! Он принимает этоSelf
слишком буквально, там.
Я также играл сTemplateBinding
, но я так и не понял, для чего это должно быть использовано, и все, что я получил, это некоторые непонятные ошибки COM (добро пожаловать в WinRT, огромный технологический шаг назад).
Как я могу (а) заставить привязки работать правильно (есть ли другие варианты наBinding
что я мог бы использовать, чтобы заставить его работать должным образом?), или (б) иначе разрешить элементы в моемItemsContainer
быть произвольно расположенным наCanvas
на основе данных привязки к свойствам элементов коллекции?