我试图收集绑定到一个ItemsControl,用帆布作为项目小组,并与每个项目的Canvas.Left和Top绑定到项目对象的属性。 基本上我试图重新建立我所描述的2-d绑定这个职位上我的博客 ,但这次是在WinRT中,而不是WPF。
由于ItemsControl的包装在另一个UI元素您的ItemTemplate内容(ContentPresenter,在WinRT中的情况下),并且它是被直接放置在物品面板内的那些包装/容器中的元素,Left和Top必须对这些容器设置; 你不能只将它们设置在DataTemplate中。 在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项目同样的事情,我什么也没得到。 甚至没有绑定错误。 如果我硬编码的值,它的工作原理; 但如果我用的结合,物业只是停留在其默认值(零),并没有约束力的错误在输出窗口中显示。
<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(即集合项目,而不是集合本身或别的东西时髦的),所以你会觉得这些绑定会工作得很好。 但是,他们甚至不似乎得到评估。 如果我把一个坏结合其他地方,并运行调试版本,我看到在调试器的输出窗口绑定错误; 但如果我引用我的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
,但我从来没有真正grokked什么是应该被用于,和所有我得到的是一些难以理解的COM错误(欢迎的WinRT,落后一个巨大的技术步骤)。
我怎么能是(a)使绑定正常工作(是否有其他选项Binding
,我可以用它来迫使它正常工作?),或(b)以其他方式允许在我的项目ItemsContainer
任意一个定位Canvas
基于在数据绑定到集合项的属性?