silverlight - 带有 ObservableCollections 的 ObservableCollection 无法正确呈现

标签 silverlight mvvm silverlight-4.0 hierarchicaldatatemplate domainservices

我对 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”的第二个项目。

(应该是什么的例子)
  • 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

  • (显示的示例)
  • 一个
  • 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
    - 银光 4
    - Visual Studio 2010

    最佳答案

    我的印象是 HierarchicalDataTemplate 是分层使用的 :) 也就是说,您只使用一个,它递归地适用于任何 child 。

    这确实意味着数据键必须相关并且数据统一(相同类型)。

    您上面描述的模板基本上是相互嵌套 3 个模板,因此您将获得每个显示的第一条记录(其中有子数据)。

    关于silverlight - 带有 ObservableCollections 的 ObservableCollection 无法正确呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3865759/

    相关文章:

    silverlight - Window Phone 7 上的 Silverlight 编程与浏览器插件有何不同?

    silverlight - 以编程方式将数百个图钉添加到 bing map 会卡住 WP7 UI

    silverlight - Silverlight Loaded 事件如何工作?

    .net - 可移植类库是否支持 System.Security.Cryptography 命名空间

    c# - 如何知道所选选项卡的名称? (MVVM)

    silverlight-4.0 - Silverlight 4 数据网格打印

    javascript - KnockOutJS 在子订阅上触发父函数

    c# - WPF 数据绑定(bind)需要手动提升

    Silverlight:打破绑定(bind)错误

    silverlight-4.0 - 如何以编程方式为TabControl创建HeaderTemplate?