Bonjour a tous,
Voila j'ai un problème concernant un menu contextuel d'un contrôle TextBox inclue dans le DataTemplate d'une DataGrid.
Contexte:
-Projet WPF avec Architecture MVVM
-Fichier xaml -> DataGrid->DataGridColumn décrit par un DataTemplate contenant un controle TextBox. Ce contrôle TextBox a un controle ContextMenu qui lui est lié.
Connaissance:
Un contrôle ContextMenu n'hérite pas du DataContext du contrôle auquel il est lié car ils ne font pas parti du même arbre visuel. Dans ce cas il faut préciser le DataContext du contrôle ContextMenu avec un "Binding" sur l'objet où il est placé.
Voici un petit exemple pour illustrer mon problème:
Tout d'abord mes classes
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 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; } }
ensuite Mon ViewModel
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 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; } }
Ensuite ma View
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <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 Self}, Path=PlacementTarget.DataContext.listDataMenu}"/> </TextBlock.ContextMenu> </TextBlock> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
et enfin le code Behind de ma View
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public partial class MyView : UserControl { public MyView() { InitializeComponent(); this.DataContext = new MyViewModel(); } }
Mon probleme ici est que le menu contextuel de la DataGrid est bien "Binder" a ma liste ListDataMenu, alors que le menu contextuel lié a la TextBox ne l'est pas. (Click droit sur TextBox => ContextMenu vide; Click droit dans la dataGrid mais en dehors de la TextBox => ContextMenu rempli avec les données de listDataMenu)
Partager