我试图将一个集合绑定到一个ItemsControl,一个Canvas作为项目面板,并且每个项目的Canvas.Left和Top绑定到项目对象上的属性。基本上我试图重新创建我在this post on my blog中描述的二维数据绑定,但这次是在WinRT而不是WPF中。如何在WinRT的ItemContainerStyle中进行绑定?
由于ItemsControl将您的ItemTemplate内容封装在另一个UI元素(ContentPresenter,在WinRT中),它是直接放置在项目面板内的那些包装器/容器元素,必须将Left和Top设置为on那些容器;你不能在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
,但我从来没有真正去过那些应该用到的东西,而我得到的只是一些不可理解的COM错误(欢迎来到WinRT,这是一个巨大的技术落后步骤)。
我怎么能是(a)使绑定正常工作(在那里Binding
其他的选择,我可以用它来迫使它才能正常工作?),或(b)以其他方式允许项目在我ItemsContainer
被任意定位在Canvas
基于数据绑定收集物品的属性?
这是一个非常聪明的技术突破,它确实在WinRT中的工作 - 虽然语法是不同的;你必须做'新的绑定{路径=新的PropertyPath(newValue)}'而不是'新的绑定(newValue)'。我也想我会重命名附加属性以'Path'或'BindingPath'结束,这样XAML就更容易遵循。但总而言之,一个好的,可行的解决方案。谢谢! – 2012-08-12 23:51:38
在安装最后一个版本win8.9200(8月15日之后)之后,它似乎也是 不工作!想想我会放弃在图形应用程序中的绑定:(因为它在我看来是一个大退步 –
2012-08-24 20:59:22
你试过“(Canvas.Left)”吗? – 2012-08-24 21:20:12