有三个如下类
class Site
{
//分类集合
private EntitySet<Catery> _Cateries;
}class Catery
{
string zh_name;

//分类下面的文章
private EntitySet<Article> _Articles;
//分类下面的子类
private EntitySet<Catery> _Cateries;
//分类的父类
private EntityRef<Catery> _Catery1;
}Class Article
{
string _title;
}xaml代码:
<Grid x:Name="SiteTreeGrid">
<Grid.Resources>
<DataTemplate DataType="{x:Type cms:Article}">
<TextBlock Text="{Binding Path=title}"/>
</DataTemplate>

<HierarchicalDataTemplate DataType="{x:Type cms:Catery}">
<HierarchicalDataTemplate.ItemsSource>
<Binding>
<Binding.Source>
<CompositeCollection>
<CollectionContainer Collection="{Binding Cateries}"/>
<CollectionContainer Collection="{Binding Articles}"/>
</CompositeCollection>
</Binding.Source>
</Binding>
</HierarchicalDataTemplate.ItemsSource>
<TextBlock Text="{Binding Path=zh_name}"/>
</HierarchicalDataTemplate>
</Grid.Resources> <TreeView x:Name="SiteTreeView"> </TreeView>
</Grid>
xaml.cs代码
TreeViewItem tempItem = new TreeViewItem();
tempItem.Header = header;
tempItem.ItemsSource = Site.Cateries;
//Site.Cateries中的数据及(理想的显示效果)如下:
Site.Cateries
+--分类A
+----分类B(属于分类A)
|--------文章B(属于分类B)
+-----分类C(属于分类B)
|--文章A(属于分类A)
但实际上只显示了下面的效果,没有递归的显示子类及文章.
Site.Cateries
|--分类A
求一解决办法,需要支持绑定,在我Site.Cateries[0].Cateries.Add(Catery)的时候界面会自动更新数据.
上面是绑定到Xaml中
另一个办法呢是这样的,可以显示成理想的效果,可是添加数据Site.Cateries[0].Cateries.Add(Catery)的时候前台不会自动更新,伪代码如下:
class Site
{
//分类集合
private EntitySet<Catery> _Cateries;
}class Catery
{
string zh_name;

//分类下面的文章
private EntitySet<Article> _Articles;
//分类下面的子类
private EntitySet<Catery> _Cateries;
//分类的父类
private EntityRef<Catery> _Catery1;

//前台xaml文件绑定到Children
public IList Children
{
get
{
 return new CompositeCollection()
{
new CollectionContainer() { Collection =Cateries},
new CollectionContainer() { Collection = Articles }
};
}
}
}Class Article
{
string _title;
}xaml文件
<Grid x:Name="SiteTreeGrid">
<Grid.Resources>
<DataTemplate DataType="{x:Type cms:Article}">
<TextBlock Text="{Binding Path=title}"/>
</DataTemplate> <HierarchicalDataTemplate DataType="{x:Type cms:Catery}"  ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Path=zh_name}"/>
</HierarchicalDataTemplate>
</Grid.Resources><TreeView x:Name="SiteTreeView"></TreeView>
</Grid>
xaml.cs文件
TreeViewItem tempItem = new TreeViewItem();
tempItem.Header = header;
tempItem.ItemsSource = Site.Cateries;
//显示效果如下,
Site.Cateries
|--分类A
|----分类B(属于分类A)
|-------文章B(属于分类B)
|-----分类C(属于分类B)
|--文章A(属于分类A)
可是我对Site.Cateries[0].Cateries.Add(Catery)添加的时候,前台节点不会自动增加,但如果Site.Cateries.Add(Catery)的时候会增加一个节点到根下面.
查阅了一些文档EntitySet不支持绑定,需要使用
ObservableCollection,可是如果Catery类中的Children这样去定义,语法就行不通,求解?
public Observable Children
{
get
{
 return new CompositeCollection()
{
new CollectionContainer() { Collection =Cateries},
new CollectionContainer() { Collection = Articles }
};
}
}
我如果照下面的封装,可以在增加节点的时候前台自动更新,但是不显示文章
class Site
{
//分类集合
private EntitySet<Catery> _Cateries;
}class Catery
{
string zh_name;

//分类下面的文章
private EntitySet<Article> _Articles;
//分类下面的子类
private EntitySet<Catery> _Cateries;
//分类的父类
private EntityRef<Catery> _Catery1;

private ObservableCollection<Catery> _CateriesObserv; public ObservableCollection<Catery> CateriesObserv
{
get { return _CateriesObserv; }
set

_CateriesObserv = value;
this.SendPropertyChanged("CateriesObserv");
}
}

//前台xaml文件绑定到Children
public IList Children
{
get
{
 return new CompositeCollection()
{
new CollectionContainer() { Collection =Cateries},
new CollectionContainer() { Collection = Articles }
};
}
}
}Class Article
{
string _title;
}xaml文件
<Grid x:Name="SiteTreeGrid">
<Grid.Resources>
<DataTemplate DataType="{x:Type cms:Article}">
<TextBlock Text="{Binding Path=title}"/>
</DataTemplate> <HierarchicalDataTemplate DataType="{x:Type cms:Catery}"  ItemsSource="{Binding CateriesObserv}">//这里有改变,这里换成Children就不能增加节点了,为什么?
<TextBlock Text="{Binding Path=zh_name}"/>
</HierarchicalDataTemplate>
</Grid.Resources><TreeView x:Name="SiteTreeView"></TreeView>
</Grid>
xaml.cs文件
TreeViewItem tempItem = new TreeViewItem();
tempItem.Header = header;
tempItem.ItemsSource = Site.CateriesObserv;
//显示效果如下,
Site.CateriesObserv
|--分类A
|----分类B(属于分类A)
|-----分类C(属于分类B)
上面所有的一切只有一个目的,在一个节点下如果有子节点就显示并且如果此节点下有文章也显示文章,并且可以支持绑定,在对Site.Cateries.Add操作的时候
前台界面自动更新.