我对 Silverlight 体验相对较新,我正在尝试创建一个带有 DomainService 的 MVVM 应用程序,该应用程序将 POCO 作为模型返回。我有一个 UserControl,它有一个 TreeView,其 ItemsSource 设置为绑定到一个 ObservableCollection 类型,该类型具有 ObservableCollection 作为其属性之一,并且该集合属于具有 ObservableCollection 属性的类型。所以我使用 HierarchicalDataTemplate 作为带有 TextBlocks 的 TreeView 的 ItemTemplate 来呈现每个项目的 Name 属性。我将在下面包含一些代码。
所以类将是这样的:
public class A
{
public int ID { get; set; }
public string Name { get; set; }
public ObservableCollection<B> Bs { get; set; }
}
public class B
{
public int ID { get; set; }
public string Name { get; set; }
public ObservableCollection<C> Cs { get; set; }
}
public class C
{
public int ID { get; set; }
public string Name { get; set; }
}
基本上,我的集合是从 DataRepository 中填充的,该方法使用获取 A、B 和 C 列表的方法。通过 foreach 循环使用 LINQ 适当地添加每个实例。并返回一个列表。该方法正常工作,因为我从 default.aspx.cs 调用它并逐步确认所有数据都已正确添加。
但我的问题是,当它在屏幕上呈现时,没有一个集合是正确的。例如,“A”的“B”子集合的第一项应该有超过 4000 的计数,但没有显示。然而,应该在第一个“A”的集合“Bs”中的“B”的第一个项目显示为“A”的第二个项目。
(应该是什么的例子)
a1
- b1.1
- c1.1.1
- c1.1.2
- c1.1.3
- b1.2
- c1.2.1
- c1.2.2
- b1.1
a2
- b2.4
- c2.4.1
- c2.4.2
- c2.4.3
- b2.4
a3
- b3.6
- c3.6.1
- c3.6.2
- c3.6.3
- b3.6
a4
- b4.8
- c4.8.1
- c4.8.2
- c4.8.3
- b4.8
(显示的示例)
- a1
- a2
- b2.2
- c2.2.2
- b2.2
- a3
- a4
- b4.4
- c4.4.4
- b4.4
经过一番调查,我看到的唯一模式是层次结构基于相同的 ID。
以下是代码示例:
(DataContext 由 UserControl 资源设置)
<sdk:TreeView ItemsSource="{Binding Path=As}" >
<sdk:TreeView.ItemTemplate>`
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Bs}">
<TextBlock Text="{Binding Path=Name}" />
<sdk:HierarchicalDataTemplate.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Cs}">
<TextBlock Text="{Binding Path=Name}" />
<sdk:HierarchicalDataTemplate.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding}">
<TextBlock Text="{Binding Path=Name}" />
</sdk:HierarchicalDataTemplate>
</sdk:HierarchicalDataTemplate.ItemTemplate>
</sdk:HierarchicalDataTemplate>
</sdk:HierarchicalDataTemplate.ItemTemplate>
</sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>
</sdk:TreeView>
视图模型
public class myViewModel
{
private myDomainContext context = new myDomainContext();
public ObservableCollection<A> As
{
get
{
LoadOperation<A> loadOp = context.Load(context.GetAsQuery());
return new ObservableCollection<A>(loadOp.Entities);
}
}
}
对于这个问题的长度,我深表歉意,我希望不要如此含糊,并获得一些有用的建议。这个问题已经困扰我几天了,我已经准备好继续前进了。请帮助我摆脱困境。提前致谢。如果您有任何对我的 MVVM 知识有帮助的好的链接,我也将不胜感激。
我的环境是: - Asp.Net 4 - Silverlight 4 - VisualStudio 2010