WPF: как создать отдельные ресурсы для каждого элемента в связанном ItemsControl - PullRequest
0 голосов
/ 21 декабря 2010

Я хочу добиться следующего:

  • My ViewModel предоставляет свойство с именем «Categories», которое представляет собой коллекцию объектов CategoryViewModel
  • Каждый объект CategoryViewModel предоставляет свойство с именем «Items», которое представляет собой набор строк *.
  • В моем представлении я хочу TabControl с TabItem для каждого объекта в коллекции «Категории».
  • Содержимое каждого элемента 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>
    

Это работает нормально, когда я связываюсь напрямую со свойством ItemsSource DataGridControl. Однако, чтобы использовать все функциональные возможности DataGridControl, мне нужно связать свойство ItemsSource DataGridControl с объектом DataGridCollectionViewSource, который связан с моей коллекцией Items. Я делаю это, когда сетка НЕ ​​вложена в другой элемент управления, создавая объект DataGridCollectionViewSource в разделе ресурсов UserControl и привязывая его к этому.

<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, чтобы с ним мог быть связан DataGridControl, созданный в содержимом элемента TabItem?

Ясно, как грязь, верно? :)

Спасибо!

Примечания:

* В реальном решении коллекция содержит объекты класса, который является более сложным, чем простая строка, но для упрощения примера использовалась строка.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010

Вы можете использовать атрибут x:Shared="True" для ресурса. Это означает, что для каждого использования этого ресурса создается новый экземпляр.

Пример:

<UserControl.Resources>
    <xcdg:DataGridCollectionViewSource x:Key="GridData" 
        x:Shared="False"
        Source="{Binding Items}" />
</UserControl.Resources>
0 голосов
/ 21 декабря 2010

ОК, это немного надолго, но не могли бы вы использовать 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, поэтому не могу проверить, работают ли они - просто пара идей, чтобы попробовать!

Колин Э.

...