У меня есть сложная проблема, связанная с 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
, но безрезультатно!!!
Есть идеи?