我该怎么做在ItemContainerStyle绑定在WinRT中?(How do I do bin

2019-06-17 16:29发布

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

Answer 1:

绑定不支持setter方法。 我想,如果在所有的Silverlight只拿到了他们5版本。 对于解决办法,你可以看看我的大文章在这里 。 基本上你定义为您设置绑定附加依赖项属性。



Answer 2:

应用的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>


Answer 3:

替代方案:这里有其他机会通过代码创建演示文稿之前“项目”的过程中附加绑定。

ItemsControl.PrepareContainerForItemOverride http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.ui.xaml.controls.itemscontrol.preparecontainerforitemoverride.aspx

ListViewBase.ContainerContentChanging http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.ui.xaml.controls.listviewbase.containercontentchanging.aspx



文章来源: How do I do bindings in ItemContainerStyle in WinRT?