如何在具有 2 个不同嵌套列表的 Xamarin Mac 中填充 NSOutlineView

How to populate NSOutlineView in Xamarin Mac having 2 different nested Lists

我正在 Xamarin 中为 Mac 开发一个需要 TreeView 的应用程序。我正在实施 NSOutlineView 以实现 TreeView。我想从一个列表中填充大纲视图,该列表本身包含一个不同类型的列表。例如 列表是 列表列表 classes的定义如下

Class ClassA:NSObject
{
   public List<ClassB> listClassB { get; set; }
   public string Types { get; set; }
}

B类如下

public class ClassB
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int TypeName { get; set; }
        public ClassC Owner { get; set; }
        public DateTime LastActivity { get; set; }
        public Collection<ClassC> Users { get; set; }
    }

但是我不知道如何在 Xamarin for Mac 的 NSOutlineView 中实现这个列表。 xamarin给出的例子只有一个class。但我有 3 classes

请尽快帮助我。

有几种方法可以解决这个问题。我使用单个通用 class 作为 sourcelistitem,它有一个通用项目的子列表,以便能够构建树。

您可以让您 classes 从通用 sourcelistitem 继承,或者在通用项目 class 中创建属性以使其可以包含您的不同 classes。

使用继承方法的简化示例:

public class SourceListItem: NSObject, IEnumerator, IEnumerable
{
    private List<SourceListItem> _items = new List<SourceListItem> ();
}

Class ClassA: SourceListItem
{

   public string Types { get; set; }
}

Class ClassB: SourceListItem
{

  public int Id { get; set; }
  public string Name { get; set; }
  public int TypeName { get; set; }
  public DateTime LastActivity { get; set; }

}

从根本上说,Cocoa 不关心你的内部数据结构,它只关心两件事:

  • 树的结构。您通过 NSOutlineViewDataSource 派生 class 回答 GetChildrenCount / GetChild / ItemExpandable

  • 来提供此信息
  • 查看每棵树。您通过派生的 NSOutlineViewDelegate 提供此 class 通过 GetView 返回一个(您在 GetChild 中返回的 NSObject 传递给您)。

因此您的 delegate/datasource 可以传递对列表的引用,从中确定应该显示多少 items/children,并正确回答问题。

你可以在这里看到一个详细的例子:https://github.com/xamarin/mac-samples/blob/master/NSOutlineViewAndTableView/NSOutlineViewAndTableViewExample/NSOutlineViewCode/NSOutlineViewExample.cs#L47