[C#] TreeView SelectedItem MVVM
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:
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:
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:
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.