始めに
WPF初心者がMVVMを用いたアプリケーションを作る過程で、自分がはまった内容を備忘録として残そうと思います。
今回はWindowsのフォルダみたいに、TreeViewをMVVMでどうやってバインドすれば良いのかはまったので記載します。
ちなみにMVVMフレームワークはCaliburn.Microを使っています。(PrismとかLivetとかの方良いか悩み中)
XAML側
<TreeView Name="treeview" ItemsSource="{Binding TreeViewItems}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:TreeItem}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
合計3つBindingしないといけない。TreeViewにBindingする必要があるのに気づかず結構はまった。
ViewModel側
public class MainWindowViewModel : PropertyChangedBase
{
private ObservableCollection<TreeItem> _treeViewItems = new ObservableCollection<TreeItem>();
public ObservableCollection<TreeItem> TreeViewItems
{
get { return _treeViewItems; }
set
{
_treeViewItems = value;
NotifyOfPropertyChange(() => TreeViewItems);
}
}
}
public class TreeItem : PropertyChangedBase
{
private String _name = "";
public String Name
{
get { return _name; }
set
{
_name = value;
NotifyOfPropertyChange(() => Name);
}
}
private ObservableCollection<TreeItem> _children = new ObservableCollection<TreeItem>();
public ObservableCollection<TreeItem> Children
{
get { return _children; }
set
{
_children = value;
NotifyOfPropertyChange(() => Children);
}
}
…(省略)…
}
用意するクラスは、2つ
- TreeViewにBindingするTreeViewItems
- TreeViewItemsにAddするTreeItem
TreeItemに表示用のNameと、子要素のChildrenを用意する。
ChildrenにTreeItemをAddすることで階層表示ができる。