Bonjour (Bonsoir plutôt) à tous,
Le titre est assez explicite, je n'arrive pas à récupérer l'élément sélectionné dans une TreeView que j'alimente dynamiquement suivant des requêtes vers une API Rest. J'utilise MVVM.
Je me suis basé sur cet exemple : http://www.codeproject.com/KB/WPF/Tr...ViewModel.aspx
Voici mon code :
Xaml :
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 <Window x:Class="DynamicTreeView.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:DynamicTreeView.ViewModel" Title="MainWindow" Height="350" Width="525"> <Grid> <TreeView ItemsSource="{Binding Folders}"> <TreeView.ItemContainerStyle> <!-- This Style binds a TreeViewItem to a TreeViewItemViewModel. --> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> <Setter Property="FontWeight" Value="Normal" /> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="FontWeight" Value="Bold" /> </Trigger> </Style.Triggers> </Style> </TreeView.ItemContainerStyle> <TreeView.Resources> <HierarchicalDataTemplate DataType="{x:Type vm:FolderViewModel}" ItemsSource="{Binding Children}" > <StackPanel Orientation="Horizontal"> <Image Width="16" Height="16" Margin="3,0" Source="Images\folder.png" /> <TextBlock Text="{Binding FolderName}" /> </StackPanel> </HierarchicalDataTemplate> </TreeView.Resources> </TreeView> </Grid> </Window>
code behind :
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
35
36
37
38
39
40
41
42 using System.Windows; using DynamicTreeView.ViewModel; using System.Collections.Generic; using DynamicTreeView.Model; using System.Net; using System.Text; using System.Xml; namespace DynamicTreeView { /// <summary> /// Logique d'interaction pour MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List<Folder> list = new List<Folder>(); WebClient serviceRequest = new WebClient(); serviceRequest.Credentials = new NetworkCredential("username", "password"); serviceRequest.Encoding = Encoding.UTF8; var res = serviceRequest.DownloadString("url"); XmlDocument doc = new XmlDocument(); doc.LoadXml(res); XmlNode root = doc.DocumentElement; foreach (XmlElement elemUser in root.ChildNodes) { list.Add(new Folder(elemUser.GetAttribute("title"), elemUser.GetAttribute("id"))); } FolderViewModel viewModel = new FolderViewModel(list); base.DataContext = viewModel; } } }
FolderViewModel :
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
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 using DynamicTreeView.Model; using System.Collections.ObjectModel; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Xml; namespace DynamicTreeView.ViewModel { class FolderViewModel : TreeViewItemViewModel { readonly Folder _folder; readonly ReadOnlyCollection<FolderViewModel> _folders; public FolderViewModel(Folder folder) : base(null, true) { _folder = folder; } public FolderViewModel(List<Folder> folders) { _folders = new ReadOnlyCollection<FolderViewModel>( (from folder in folders select new FolderViewModel(folder)) .ToList()); } public ReadOnlyCollection<FolderViewModel> Folders { get { return _folders; } } public string FolderName { get { return _folder.FolderName; } } public string FolderId { get { return _folder.FolderId; } } protected override void LoadChildren() {WebClient serviceRequest = new WebClient(); serviceRequest.Credentials = new NetworkCredential("username", "password"); serviceRequest.Encoding = Encoding.UTF8; var res = serviceRequest.DownloadString("url"); XmlDocument doc = new XmlDocument(); doc.LoadXml(res); XmlNode root = doc.DocumentElement; List<Folder> list = new List<Folder>(); foreach (XmlElement elemUser in root.ChildNodes) list.Add(elemUser.GetAttribute("id"))); foreach (Folder folder in list) base.Children.Add(new FolderViewModel(folder)); } } }
qui hérite de TreeViewItemViewModel qui est le même que dans l'exemple.
Merci d'avance.
Partager