У меня есть хитрая проблема, связанная с 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
.Поэтому я попытался отредактировать DataGridColumn
DataTemplate
с TextBox
, который имеет ContextMenu
.К сожалению, когда я щелкаю правой кнопкой мыши по TextBox
, ContextMenu
ItemsSource
кажется пустым.Однако, когда я щелкаю правой кнопкой мыши за TextBox
в DataGrid
, DataGrid
ContextMenu
правильно связывается.
Я думал, что это может быть проблема DataContext
, потому что ContextMenu
и DataGrid
не имеют одинакового дерева визуалов, поэтому я добавил RelativeSource
в ContextMenu
ItemsSource
привязку, но без результата !!!
Есть идеи?