WPF:如何为绑定的ItemsControl中的每个项创建单独的资源

时间:2010-12-20 21:59:21

标签: wpf xaml data-binding collections

我想实现以下目标:

  • 我的ViewModel公开名为'Categories'的属性,它是CategoryViewModel对象的集合
  • 每个CategoryViewModel对象都公开一个名为“Items”的属性,该属性是字符串*的集合。
  • 在我的视图中,我想要一个带有TabItem的TabControl,用于“Categories”集合中的每个对象。
  • 每个TabItem的内容应该是一个xceed DataGrid控件,显示所选选项卡的Items集合的内容。

    <TabControl ItemsSource="{Binding Categories}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding CategoryName}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <xcdg:DataGridControl
                        ItemsSource="{Binding Items}"
                        AutoCreateColumns="True">
                </xcdg:DataGridControl>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
    

当我直接绑定到DataGridControl的ItemsSource属性时,这可以正常工作。但是,为了利用DataGridControl的所有功能,我需要将DataGridControl的ItemsSource属性绑定到绑定到Items集合的DataGridCollectionViewSource对象。我通过在UserControl的Resources部分中创建一个DataGridCollectionViewSource对象并绑定到另一个控件中来实现此目的。

<UserControl>
    <UserControl.Resources>
        <xcdg:DataGridCollectionViewSource x:Key="GridData"
            Source="{Binding Items}" />
    </UserControl.Resources>
    <Grid>
        <xcdg:DataGridControl
                ItemsSource="{Binding Source={StaticResource GridData}}"
                AutoCreateColumns="True">
        </xcdg:DataGridControl>
    </Grid>
</UserControl>

如何构建XAML,以便在绑定TabControl时,为每个TabItem创建一个DataGridCollectionViewSource对象,以便在TabItem的内容中生成的DataGridControl可以绑定到它?

清楚如泥,对吗? :)

谢谢!

说明:

*在真正的解决方案中,集合包含比简单字符串更复杂的类的对象,但是使用字符串使示例更简单。

2 个答案:

答案 0 :(得分:0)

好的,这是一个长镜头,但你可以使用DataGrid.Tag ......

<TabControl.ContentTemplate>
    <DataTemplate>
        <xcdg:DataGridControl
                ItemsSource="{Binding RelativeSource={RelativeSource Self}, Path=Tag}"
                AutoCreateColumns="True">
            <xcdg:DataGridControl.Tag>
                 <xcdg:DataGridCollectionViewSource x:Key="GridData"
                      Source="{Binding Items}" />
            </xcdg:DataGridControl.Tag>
        </xcdg:DataGridControl>
    </DataTemplate>
</TabControl.ContentTemplate>

或者......可以在任何FrameworkElement上定义资源,因此您可以尝试:

<TabControl.ContentTemplate>
    <DataTemplate>
        <xcdg:DataGridControl
                ItemsSource="{Binding Source={StaticResource GridData}}"
                AutoCreateColumns="True">
            <xcdg:DataGridControl.Resources>
                 <xcdg:DataGridCollectionViewSource x:Key="GridData"
                      Source="{Binding Items}" />
            </xcdg:DataGridControl.Resources>
        </xcdg:DataGridControl>
    </DataTemplate>
</TabControl.ContentTemplate>

我没有使用eXceed Grid因此无法测试这些是否有效 - 只需要尝试几个想法!

Colin E。

答案 1 :(得分:0)

您可以在资源上使用x:Shared="True"属性。这意味着为每次使用该资源创建一个新实例。

实施例

<UserControl.Resources>
    <xcdg:DataGridCollectionViewSource x:Key="GridData" 
        x:Shared="False"
        Source="{Binding Items}" />
</UserControl.Resources>