ObservableCollection与Ob​​servableCollections无法正确呈现

时间:2010-10-05 16:35:52

标签: silverlight mvvm silverlight-4.0 hierarchicaldatatemplate domainservices

我对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

    • B1.1
      • c1.1.1
      • c1.1.2
      • C1.1.3
    • B1.2
      • c1.2.1
      • C1.2.2
  • A2

    • B2.4
      • c2.4.1
      • c2.4.2
      • c2.4.3
  • A3

    • B3.6
      • c3.6.1
      • c3.6.2
      • c3.6.3
  • A4

    • b4.8
      • c4.8.1
      • c4.8.2
      • c4.8.3

(它显示的例子)

  • A1
  • A2
    • B2.2
      • c2.2.2
  • A3
  • A4
    • B4.4
      • c4.4.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

2 个答案:

答案 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”)

这表示该物业已更新。