我对Silverlight体验相对较新,我正在尝试使用DomainService创建一个MVVM应用程序,该应用程序将POCO作为模型返回。我有一个UserControl,它有一个TreeView,其ItemsSource设置为绑定到ObservableCollection类型,该类型具有ObservableCollection作为其属性之一,并且该集合属于具有ObservableCollection属性的类型。所以我使用HierarchicalDataTemplate作为TreeView的ItemTemplate和TextBlocks来呈现每个项目的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适当地添加每个实例。并返回一个List。该方法正常工作,因为我从default.aspx.cs调用它并逐步确认所有数据都已正确添加。
但我的问题是,当它在屏幕上呈现时,没有一个集合是正确的。例如,“A”的子集合“B”的第一项应该具有超过4000的计数,但是没有显示。然而,第一个“A”的第一项“B”应该出现在第一个“A”的集合“Bs”中。第二项是“A”。
(应该是什么样的例子)
A1
A2
A3
A4
(它显示的例子)
经过一番调查后,我看到的唯一模式是层次结构基于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
答案 0 :(得分:1)
我的印象是使用了HierarchicalDataTemplate 层次结构 :)也就是说,你只使用一个,它会递归地应用于任何子节点。
这意味着数据键必须相关且数据统一(相同类型)。
您上面描述的模板基本上是将3个模板嵌套在一起,因此您可以获得每个模板的第一条记录(其中有子数据)。
答案 1 :(得分:0)
我认为你应该考虑的一件事是让对象实现INotifyPropertyChanged。请参阅此示例http://snipplr.com/view/13639/viewmodelbase-class/
在这种情况下,你必须稍微改变一下属性
private int _id;
public int Id
{
get { return _id;}
set { _id = value; NotifyChanged("Id");}
}
它不必在属性内。当您更新子集合时,例如Bs,您可以调用NotifyChanged(“Bs”)
这表示该物业已更新。