Проблема с привязкой DataGridComboBoxColumn.ItemsSource

У меня есть 3 таблицы: Item - это DataContext - у него есть столбец навигации Group Group - имеет столбец навигации Category.

Я хочу, чтобы в DataGrid были оба столбца (Категория и группа), и когда я выбираю категорию, она должна отображаться в столбце группы только Category.Groups.

Вот код, над которым я работаю:

<tk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}">
    <tk:DataGrid.Columns>

        <!--Works-->
        <tk:DataGridComboBoxColumn                                        
            Header="Categroy" 
            DisplayMemberPath="Title"                    
            SelectedValuePath="CategoryId"
            SelectedValueBinding="{Binding Group.Category.CategoryId}"
            ItemsSource="{Binding Context.Categories, 
                Source={x:Static Application.Current}}"
        />


        <!--Look at these two things:-->

        <!--This does work-->
        <tk:DataGridTemplateColumn>
            <tk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ItemsControl
                        ItemsSource="{Binding Group.Category.Groups}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate DataType="{x:Type data:Group}">
                                <TextBlock Text="{Binding Title}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </tk:DataGridTemplateColumn.CellTemplate>
        </tk:DataGridTemplateColumn>

        <!--But this does NOT work, even it's the same source-->
        <!--Notice I even tried a dummy converter and doesnt reach there-->
        <tk:DataGridComboBoxColumn 
            Header="Group" 
            DisplayMemberPath="Title"
            SelectedValuePath="GroupId"
            ItemsSource="{Binding Group.Category.Groups,
                Converter={StaticResource DummyConverter}}"
            SelectedValueBinding="{Binding Group.GroupId}"
            />

    </tk:DataGrid.Columns>
</tk:DataGrid>

Обновление
Вы бы сказали, что проблема в том, что для свойства ItemsSource нельзя задать нестатическое связывание? Я подозреваю, что это так, потому что даже я установил ItemsSource в {Binding} с DummyConverter, он не останавливается в конвертере; и в категории ComboBox он работает нормально.


person Shimmy Weitzhandler    schedule 12.11.2009    source источник


Ответы (2)


Столбцы в сетке данных не имеют текста, так как они никогда не добавляются в визуальное дерево. звучит немного странно, но взгляните на блог Винса, в нем есть хороший пример визуального оформления. после того, как сетка нарисована, ячейки имеют контекст данных, и вы можете установить в них источники элементов поля со списком, используя обычные привязки (а не статические ресурсы ..)

Вы можете получить доступ к источнику элементов поля со списком как таковой:

<dg:DataGridComboBoxColumn>
   <dg:DataGridComboBoxColumn.EditingElementStyle>
      <Style TargetType="ComboBox">
         <Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
      </Style>
   </dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>

Посмотрите здесь, а также здесь для кода. Вам также потребуется установить источник элементов для нередактируемого элемента, как в этом сообщении

person Aran Mulholland    schedule 15.11.2009
comment
Как заставить его работать для .NET 4.0 Datagrid? Блог Винса кажется устаревшим. - person newman; 06.06.2011
comment
Я не думаю, что реализация ComboColumn в datagrid изменилась в выпуске .net 4 - person Aran Mulholland; 07.06.2011
comment
Я использовал тот же подход, но источник данных, похоже, не связывает столбец. Я вижу пустое поле со списком в DataGrid - person Nps; 30.12.2012
comment
Добавьте на него debugConverter и посмотрите, срабатывают ли привязки (wpftutorial.net/DebugDataBinding.html) - person Aran Mulholland; 31.12.2012
comment
Разве это не должно работать только для нацеливания на конкретное имя элемента, у которого есть DataContext? - person William; 11.05.2013
comment
Я знаю, что это устарело, но я могу использовать {Binding MyBindingPath} вместо {Binding Path = MyBindingPath}. - person Lukeduke Animations; 30.06.2021

Я использовал MVVM и хотел привязать ItemSource столбца к коллекции объектов в контексте данных окна. Я, должно быть, пробовал 10 разных способов, и ничего не работало, пока не нашел этот ответ.

Уловка состоит в том, чтобы определить CollectionViewSource вне сетки, а затем ссылаться на него внутри сетки с помощью StaticResource. Например,

<Window.Resources>
    <CollectionViewSource x:Key="ItemsCVS" Source="{Binding MyItems}" />
</Window.Resources>
<!-- ... -->
<DataGrid ItemsSource="{Binding MyRecords}">
    <DataGridComboBoxColumn Header="Column With Predefined Values"
                            ItemsSource="{Binding Source={StaticResource ItemsCVS}}"
                            SelectedValueBinding="{Binding MyItemId}"
                            SelectedValuePath="Id"
                            DisplayMemberPath="StatusCode" />
</DataGrid>
person John Henckel    schedule 29.08.2017
comment
Думаю, это решение проще, чем использование прокси-элементов ... Спасибо! - person vladimir khozeyev; 31.07.2019