Bonjour,
Je rencontre une petite difficulté concernant un CheckBox dans un ListView. Je souhaite que la ligne du ListView sur lequel est placée la case à cocher soit sélectionnée lorsque je la coche. En effet l'action de cocher modifie bien IsTraite mais ne déclenche pas "OnCollectionViewPersCurrentChanged". Merci d'avance pour vos réponses.
Voici mon xaml (le datacontexte du usercontrole est Master2ViewModel):
Le ViewModel associé :
Code : 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 <UserControl x:Class="Test.View.PersonneView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <ListView Margin="10, 10, 10, 10" ItemsSource="{Binding Personnes}" IsSynchronizedWithCurrentItem="True"> <ListView.View> <GridView> <GridViewColumn Header="Traitée"> <GridViewColumn.CellTemplate> <DataTemplate> <CheckBox HorizontalAlignment="Center" IsChecked="{Binding Path=IsTraite, Mode=TwoWay}" Command="{Binding DataContext.CheckCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Nom" DisplayMemberBinding="{Binding Nom}"/> <GridViewColumn Header="Prenom" DisplayMemberBinding="{Binding Path=Prenom}"/> </GridView> </ListView.View> </ListView> </Grid> </UserControl>
Mon ViewModel Maitre :
Code : 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
35
36
37
38
39
40
41
42 namespace Test.ViewModel { /// <summary> /// Description of AnomaliesViewModel. /// </summary> public class PersonnesViewModel : ViewModelBase { private readonly Personne personne; private bool modifie; public bool Modifie { get {return this.modifie;} set {this.modifie = value;} } public string Nom { get { return this.personne.Nom;} set { this.personne.Nom = value; OnPropertyChanged("Nom");} } public string Prenom { get { return this.personne.Prenom;} set { this.personne.Prenom = value; OnPropertyChanged("Prenom");} } public bool IsTraite { get { return this.personne.IsTraite;} set { this.Modifie = true; this.personne.IsTraite = value; OnPropertyChanged("IsTraite");} } public PersonnesViewModel(Personne personne) { if(personne == null) throw new NullReferenceException("personne"); this.personne = personne; this.Modifie = false; } } }
Le code ci-dessous est un extrait (adapté) du code original ce qui peut impliqué des incohérences.
Code : 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 namespace Test.ViewModel { /// <summary> /// Description of Master2ViewModel. /// </summary> public class Master2ViewModel : ViewModelBase { private List<Personnes> pers; private readonly ObservableCollection<PersonnesViewModel> personnes; private readonly ICollectionView collectionViewPers; private ICommand checkCommand; public Master2ViewModel() { this.personnes = new ObservableCollection<PersonnesViewModel>(); this.pers = new List<Personne>(); this.collectionViewPers = CollectionViewSource.GetDefaultView(this.personnes); if(this.collectionViewPers == null) throw new NullReferenceException("collectionViewPers"); this.collectionViewPers.CurrentChanged += new EventHandler(this.OnCollectionViewPersCurrentChanged); } public ObservableCollection<PersonnesViewModel> Personnes { get { return this.personnes;} } public PersonnesViewModel SelectedPers { get { return this.collectionViewPers.CurrentItem as PersonnesViewModel;} } private void OnCollectionViewPersCurrentChanged(object sender, EventArgs e) { OnPropertyChanged("SelectedPers"); if(this.SelectedPers != null) AffichagePersonneDetails(); } public ICommand CheckCommand { get { if (checkCommand == null) checkCommand = new RelayCommand(() => this.CheckTraite(), () => this.CanCheckTraite()); return checkCommand; } } private void CheckTraite() { Trace.WriteLine("Case cochée"); } private bool CanCheckTraite() { // Fait des trucs return true; } } }
Partager