Проблема с привязкой DataGridComboBoxColumn.ItemsSource
-
19-09-2019 - |
Вопрос
У меня есть 3 таблицы:Элемент - который является DataContext - имеет группу столбцов навигации Group - имеет категорию столбцов навигации.
Я хочу иметь в DataGrid оба столбца (Категория и группа), и когда я выбираю категорию, она должна отображать в списке групп только Категорию.Группы.
Вот код, над которым я работаю:
<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 это работает нормально.
Решение
Столбцы в datagrid не имеют datacontext, поскольку они никогда не добавляются в визуальное дерево.звучит немного странно, но взгляните на блог Винса, у него есть хороший пример визуального макета.как только сетка нарисована, ячейки имеют контекст данных, и вы можете задать источник элементов полей со списком в них, используя обычные привязки (не статические ресурсы ..)
Вы можете получить доступ к источнику элементов поля со списком как таковому:
<dg:DataGridComboBoxColumn>
<dg:DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
</Style>
</dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>
Взгляните-ка здесь а также здесь для какого-то кода.Вам также нужно будет задайте источник элементов для элемента без редактирования как в этом Публикация
Другие советы
Я использовал 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>