您的位置:首页 > 其它

[SilverLight]MVVM下绑定TreeView

2013-01-07 11:03 120 查看
文章使用的是MVVMLight框架,下载地址:http://mvvmlight.codeplex.com/

首先要对TreeView进行扩展,使得它能够有Command,里面需要用到Prism,下载地址:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=28950

参考文章:http://www.silverlightshow.net/items/Make-the-TreeView-control-to-be-MVVM-compliant.aspx

需要先添加引用:

xmlns:tree="clr-namespace:[your namespace]"


View代码:

<tree:TreeViewWithCommand   ItemsSource="{Binding Root,Mode=TwoWay}"
tree:ItemExpanded.Command="{Binding ItemExpanded}"
tree:SelectedItemChanged.Command="{Binding ItemSelected}">
<tree:TreeViewWithCommand.ItemTemplate>
<c:HierarchicalDataTemplate ItemsSource="{Binding Children,Mode=TwoWay}"   >
<TextBlock Text="{Binding Current. Value,Mode=TwoWay}"></TextBlock>
</c:HierarchicalDataTemplate>
</tree:TreeViewWithCommand.ItemTemplate>
</tree:TreeViewWithCommand>


然后新增一个View用来存储TreeView的数据:

View Code

private ObservableCollection<Tree<Product>> _root;
public ObservableCollection<Tree<Product>> Root
{
get { return _root; }
private set
{
if (!ReferenceEquals(_root, value))
{
_root = value;
RaisePropertyChanged("Root");

}

}
}


先加载父级节点,对于每个节点添加loading子节点,那样展开节点时就会先显示loading节点,当获取到数据时再加载数据:

private void LoadData()
{
this.Root = new ObservableCollection<Tree<Product>>();
Root.Add(new Tree<Product>(BuildLoadingChild()));

lstProduct = 获取数据;

this.Root.Clear();
foreach (Product item in lstProduct )
{
Root.Add(new Tree<Product>(item, BuildLoadingChild()));

}
}

private Product BuildLoadingChild()
{
return new Product()
{
ProductId = -999,
ProductName = "loading"
};
}


展开节点时获取子节点,当然不能忘记先要把loading节点给删掉,先在ViewModel中定义RelayCommand:

private RelayCommand<Tree<Product>> _itemExpanded;
public RelayCommand<Tree<Product>> ItemExpanded
{
get
{
if (_itemExpanded == null)
{
_itemExpanded = new RelayCommand<Tree<Product>>(o => this.OnItemExpanded(o));
}
return _itemExpanded;
}
}


展开事件:

private void OnItemExpanded(Tree<Product> item)
{
var lstChildren = 获取数据;
if (lstChildren == null || lstChildren.Count <= 0)
{
item.Children.Clear();
return;
}

item.Children.Clear();
foreach (Product i in lstChildren)
{
item.Children.Add(new Tree<Product>(i, BuildLoadingChild()));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: