【问题标题】:Can a DataTemplate be placed inside another DataTemplate of different Template Structure?可以将 DataTemplate 放置在不同模板结构的另一个 DataTemplate 中吗?
【发布时间】:2014-03-19 09:46:43
【问题描述】:

我希望 ListBox 的 DataTemplate 具有 ItemsSource 作为边框集合。在每个边框内,我想显示另一个列表框,其中包含一组具有自己的 ItemsSource 的项目。 但是,当我尝试实现这种结构时,我无法填充任何数据。

我的 XAML 代码 -

 <Grid x:Name="RightPanel" Grid.Column="2" Background="Beige">
            <Border  BorderBrush="Black" Margin="4" BorderThickness="1.5">
                  <ScrollViewer  Margin="2"  Focusable="False">
                    <ListBox x:Name="MainRightListBox" ItemsSource="{Binding ListBoxCollection,Mode=TwoWay}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <ListBox x:Name="ChildListBox" ItemsSource="{Binding CurrentPage.ClonedVectorImages,Mode=TwoWay}" SelectedItem="{Binding ImageVectorSelected}"  BorderBrush="Transparent" Background="Transparent">
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel x:Name="canvas" Background="Transparent" Orientation="Horizontal" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}}">
                                                <StackPanel.ContextMenu>
                                                    <ContextMenu>
                                                        <MenuItem Header="Delete" CommandParameter="{Binding}"
                                                    Command="{Binding PlacementTarget.Tag.DataContext.DeleteCloneCommand, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}, Mode=FindAncestor}}"/>
                                                    </ContextMenu>
                                                </StackPanel.ContextMenu>
                                                <Viewbox Width="35" Height="35" >
                                                    <Canvas Width="35" Height="35">
                                                        <Canvas>
                                                            <Path Fill="#ffda2526" Data="F1 M 0.000,112.500 C 0.000,50.369 50.368,0.000 112.500,0.000 C 174.632,0.000 225.000,50.369 225.000,112.500 C 225.000,174.633 174.632,225.000 112.500,225.000 C 50.368,225.000 0.000,174.633 0.000,112.500 Z" Height="30.667" Stretch="Fill" Width="31"/>
                                                            <TextBlock x:Name="tb1" Text="{Binding CountId}" Foreground="WhiteSmoke" FontSize="20" FontFamily="Arial Bold" Height="20" RenderTransformOrigin="1.588,1.224" Canvas.Left="9.322" Canvas.Top="3.335"></TextBlock>
                                                        </Canvas>
                                                    </Canvas>
                                                </Viewbox>

                                                <TextBox Text="Enter Text Here" Height="20" VerticalAlignment="Center"/>
                                            </StackPanel>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

                </ScrollViewer>
            </Border>
        </Grid>

【问题讨论】:

    标签: c# wpf datatemplate


    【解决方案1】:

    一个DataTemplate可以放在另一个不同模板结构的DataTemplate里面吗?

    答案是肯定的,可以。您的 XAML 结构很好。

    但可能错误的是使用的绑定路径/表达式。您需要注意,内部ListBoxDataTemplate 内部的那个)的DataContext 对应于ListBoxCollection 中的item。因此,如果前面提到的 item 具有属性CurrentPage.ClonedVectorImages,那么这种绑定方式应该可以很好地填充内部ListBox

    <ListBox x:Name="ChildListBox" 
             ItemsSource="{Binding CurrentPage.ClonedVectorImages,Mode=TwoWay}" 
             ........>
    

    【讨论】:

    • 我创建 ListBoxCollection 只是为了给我的 Outer ListBox 提供 Some ItemSource,所以 ListBoxCollection 只是动态创建的 Borders 的集合。在这些单独的边界内,我想放置我的 InnerListbox 项目。所以我的视图是这样的 - Border 1(listboxItem1, listBoxItem2, ....) Border2(listBoxItem3,.....) Border3(...) , ..... 我可以从同一个 XAML 中实现这个视图吗结构?
    • 如果我理解你的评论正确,我想你不能。您当前的 XAML 标记意味着,您将拥有一个 ListBox,其中每个边框都装有 ListBoxItems。如果您想将 ListBoxItems 直接放在 Border 内,并且这些 ListBoxItems 跨越 Borders 是连续的,那么这是错误的方式。
    • 好的,知道了。您能否建议任何其他方式或示例,从中我可以看到如何创建与我提到的相同的视图?
    【解决方案2】:

    你需要把DataTemplates放在对应keys的资源中,否则可能会出现异常:

    Markup.IStyle.Connector.Connect 错误

    这是studio的bug,描述如下link:

    查看这个问题的好方法“模板就像括号,引用括号”模板 XAML 不是创建而是保存并稍后运行。因此,错误是:嵌套括号有问题。

    在我认为的任何情况下,都应该避免嵌套模板并通过资源使用他,这将更容易和更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2011-03-05
      • 2011-04-28
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多