我对 Silverlight 体验相对较新,我正在尝试创建一个带有 DomainService 的 MVVM 应用程序,该应用程序将 POCO 作为模型返回。我有一个 UserControl,它有一个 TreeView,其 ItemsSource 设置为绑定(bind)到一个 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”的第二个项目。
(应该是什么的例子)
(显示的示例)
经过一番调查,我看到的唯一模式是层次结构基于相同的 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
- 银光 4
- Visual Studio 2010
最佳答案
我的印象是 HierarchicalDataTemplate 是分层使用的 :) 也就是说,您只使用一个,它递归地适用于任何 child 。
这确实意味着数据键必须相关并且数据统一(相同类型)。
您上面描述的模板基本上是相互嵌套 3 个模板,因此您将获得每个显示的第一条记录(其中有子数据)。
关于silverlight - 带有 ObservableCollections 的 ObservableCollection 无法正确呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3865759/