У меня есть сложная проблема, связанная с ContextMenu в WPF DataGridColumn. Я не знаю, сталкивался ли кто-то с этой проблемой, но я буду очень признателен, если кто-то может мне помочь!
Начнем с моих занятий
public class Person
{
public string Type { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
}
public class Menu
{
public string Name { get; set; }
public int Code { get; set; }
public ObservableCollection<Menu> listMenu { get; set; }
}
Теперь моя ViewModel
public class MyViewModel : INotifyPropertyChanged
{
private ObservableCollection<Person> DataPersons = new ObservableCollection<Person>();
private ObservableCollection<Menu> DataMenu = new ObservableCollection<Menu>();
public ObservableCollection<Person> listDataPersons { get; set; }
public ObservableCollection<Menu> listDataMenu { get; set; }
public MyViewModel()
{
//initialization
InitData();
}
private void InitData()
{
listDataPersons = new ObservableCollection<Person>();
listDataMenu = new ObservableCollection<Menu>();
DataPersons.Add(new Person() { Type = "Friend", Name = "Doe", Surname = "John", Age = 42});
DataPersons.Add(new Person() { Type = "Friend", Name = "Smith", Surname = "Jack", Age = 42});
DataMenu.Add(new Menu() { Name = "Principal", Code = 1});
DataMenu.Add(new Menu() { Name = "Secondary", Code = 2});
DataMenu.Add(new Menu() { Name = "Associated", Code = 3});
DataMenu[2].listMenu = new ObservableCollection<Menu>();
DataMenu[2].listMenu.Add(new Menu() { Name = "Associated 1", Code = 31 });
listDataPersons = DataPersons;
listDataMenu = DataMenu;
}}
Вот мой вид и его код
<DataGrid ItemsSource="{Binding listDataPersons}" AutoGenerateColumns="False">
<DataGrid.ContextMenu>
<ContextMenu ItemsSource="{Binding listDataMenu}"/>
</DataGrid.ContextMenu>
<DataGrid.Columns>
<DataGridTemplateColumn IsReadOnly="True" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" Width="80" >
<TextBlock.ContextMenu>
<ContextMenu ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Path=DataContext.listDataMenu}"/>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
код позади
public partial class MyView : UserControl
{
public MyView()
{
InitializeComponent();
this.DataContext = new MyViewModel();
}
}
В этом примере я хотел иметь динамическое ContextMenu в DataGridColumn. Сначала я поставил ContextMenu во все DataGrid, и все работает нормально. Но в моем случае мне нужно ContextMenu только при щелчке правой кнопкой мыши в ячейках, а не во всем DataGrid. Поэтому я попытался отредактировать DataTemplate DataGridColumn с помощью TextBox, у которого есть ContextMenu. К сожалению, когда я щелкаю правой кнопкой мыши в TextBox, ItemsSource ContextMenu кажутся пустыми. Однако, когда я щелкаю правой кнопкой мыши за пределами TextBox в DataGrid, ContextMenu DataGrid привязывается правильно.
Я думал, что это может быть проблема DataContext, потому что ContextMenu и DataGrid не имеют одинакового визуального дерева, поэтому я добавил RelativeSource в привязку ItemsSource ContextMenu, но безрезультатно!!!
Есть идеи?