25

我试图将一个集合绑定到一个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基于数据绑定收集物品的属性?

回答

15

Setters不支持绑定。我认为Silverlight只会在第5版中获得它们。对于变通方法,您可以查看我的旧文章here。基本上你可以定义一个附加的依赖项属性来为你设置绑定。

+3

这是一个非常聪明的技术突破,它确实在WinRT中的工作 - 虽然语法是不同的;你必须做'新的绑定{路径=新的PropertyPath(newValue)}'而不是'新的绑定(newValue)'。我也想我会重命名附加属性以'Path'或'BindingPath'结束,这样XAML就更容易遵循。但总而言之,一个好的,可行的解决方案。谢谢! – 2012-08-12 23:51:38

+0

在安装最后一个版本win8.9200(8月15日之后)之后,它似乎也是 不工作!想想我会放弃在图形应用程序中的绑定:(因为它在我看来是一个大退步 – 2012-08-24 20:59:22

+1

你试过“(Canvas.Left)”吗? – 2012-08-24 21:20:12

8

上应用的RenderTransform似乎是在Silverlight和WinRT中/城域/ 8.1为我工作很好:

<ItemsControl ItemsSource="{Binding TreeMapItems}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas Background="White"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Width="{Binding Width}" Height="{Binding Height}" Fill="{Binding Brush}" ToolTipService.ToolTip="{Binding Label}"> 
       <Rectangle.RenderTransform> 
        <TranslateTransform X="{Binding X}" Y="{Binding Y}"/> 
       </Rectangle.RenderTransform> 
      </Rectangle> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

这对我也很好!谢谢。 – KTrace 2014-09-16 16:41:48

+1

虽然它是一个非常老的帖子,但你的方法似乎是部分为我工作,唯一的问题是按钮将走出Windows中的画布电话8.1 <按钮高度= “{结合高度}” 宽度= “{结合宽度}” 内容= “{结合内容}”> < TranslateTransform X =“{绑定TopLeftX}” Y = “{结合TopLeftY}”/> 任何想法什么错? – Debhere 2015-05-23 14:17:32

相关问题