#wpf #data-binding #datagrid #contextmenu
#wpf #привязка данных #сетка данных #контекстное меню
Вопрос:
Я трачу чертовски много времени, пытаясь динамически привязать ContextMenu к DataGrid. Сетка данных привязана к списку объектов, который отлично работает:
<DataGrid ItemsSource="{Binding DataGridItems}">
Для каждого из объектов DataGridItem у меня есть список элементов меню, доступных в свойстве, которое я хотел бы использовать для привязки к ContextMenu.
Я попробовал нижеприведенное, но, кажется, мне чего-то не хватает:
<DataGrid ItemsSource="{Binding DataGridItems}">
<DataGrid.ContextMenu>
<ContextMenu ItemsSource="{Binding ContextMenuItems}" >
<MenuItem Header="{Binding Name}" Command="{Binding OnClick}"></MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid>
public class DataGridItem
{
public ObservableCollection<ContextMenuItem> ContextMenuItems
{
get { return _contextMenuItems; }
}
}
Любая помощь или руководство были бы высоко оценены.
Комментарии:
1. Возможно, это просто опечатка, но ваш класс, представляющий один элемент, называется «DataGridItems»? Кроме того, публикация более полного кода, вероятно, упростила бы устранение неполадок.
2. Вы правы, имя класса должно было быть DataGridItem. Я буду обновлять.
Ответ №1:
Вот как я в конечном итоге решил эту проблему:
<StackPanel.ContextMenu>
<ContextMenu ItemsSource="{Binding ContextMenu}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding OnClick}" />
<Setter Property="Icon">
<Setter.Value>
<Image Source="{Binding ImageName}"></Image>
</Setter.Value>
</Setter>
</Style>
</ContextMenu.ItemContainerStyle>
<ContextMenu.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type ContextMenu:ContextMenuItem}" ItemsSource="{Binding MenuItems}">
<TextBlock Text="{Binding Name}"></TextBlock>
</HierarchicalDataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
Комментарии:
1. У меня это почти сработало, но мне нужно было заменить
<Setter Property="Icon"> block with
<Setter Property=»Icon» Value=»{Binding ImageName}» />` вместо этого
Ответ №2:
Я полагаю, что в этом руководстве описывается ваша проблема, но фактически вам пришлось бы сделать:
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
ItemsSource="{Binding ContextMenuItems}" />