我似乎无法弄清楚如何创建一个简单的NSOutlineView 2列,以及数据结构是超过1平深(一个层次结构)。
我一直在研究这个数天,和所有我能找到的是Objective C的例子,我真的不能对任何使用。
我知道有这样做的,一个是数据源模式不同的模式。 我试图创建一个从NSOutlineViewDataSource继承的类,但是这就是我的一切,我对我下一步该做什么不知道!
比方说,我想在我的NSOutlineView显示下面的类:
public class Person
{
public string Name {get;set;} // First column
public int Age {get;set} // Second column
public List<Person> Children {get;set} // Children
}
什么是最微不足道的方法来实现这一点?
振作自己......在一个的MonoMac级别的独立的NSOutlineView!
数百名谷歌搜索,并通过ObjC期待以及C#代码后,我终于想通了,该怎么办呢! 我会在这里发布我的解决方案,如果别人需要它。
这可能会或可能不会做到这一点的最好办法,但它为我工作。
步骤1:在界面生成器,添加一个NSOutlineView。 新增2列到它,并设置其标识符colName
和colAge
。
此外,当你在它,添加一个按钮到表单中。
第2步 :创建NSOutlineView一个出口-我打电话给我lvMain
因为我来自一个VCL背景。 此外,为您的按钮操作(这将是的onClick处理程序)。
第3步:保存您的XIB文件,并返回到单-这将更新您的项目文件。 现在,我们要建立我们希望用我们的视图模型。
在这个例子中,我将使用一个简单的Person对象:
public class Person:NSObject
{
public string Name {
get;
set;
}
public int Age {
get;
set;
}
public List<Person> Children {
get;
set;
}
public Person (string name, int age)
{
Name = name;
Age = age;
Children = new List<Person>();
}
}
没有过于复杂的存在。
第4步:创建数据源。 在这个例子中,这是我做了什么:
public class MyDataSource:NSOutlineViewDataSource
{
/// The list of persons (top level)
public List<Person> Persons {
get;
set;
}
// Constructor
public MyDataSource()
{
// Create the Persons list
Persons = new List<Person>();
}
public override int GetChildrenCount (NSOutlineView outlineView, NSObject item)
{
// If the item is not null, return the child count of our item
if(item != null)
return (item as Person).Children.Count;
// Its null, that means its asking for our root element count.
return Persons.Count();
}
public override NSObject GetObjectValue (NSOutlineView outlineView, NSTableColumn forTableColumn, NSObject byItem)
{
// Is it null? (It really shouldnt be...)
if (byItem != null) {
// Jackpot, typecast to our Person object
var p = ((Person)byItem);
// Get the table column identifier
var ident = forTableColumn.Identifier.ToString();
// We return the appropriate information for each column
if (ident == "colName") {
return (NSString)p.Name;
}
if (ident == "colAge") {
return (NSString)p.Age.ToString();
}
}
// Oh well.. errors dont have to be THAT depressing..
return (NSString)"Not enough jQuery";
}
public override NSObject GetChild (NSOutlineView outlineView, int childIndex, NSObject ofItem)
{
// If the item is null, it's asking for a root element. I had serious trouble figuring this out...
if(ofItem == null)
return Persons[childIndex];
// Return the child its asking for.
return (NSObject)((ofItem as Person).Children[childIndex]);
}
public override bool ItemExpandable (NSOutlineView outlineView, NSObject item)
{
// Straight forward - it wants to know if its expandable.
if(item == null)
return false;
return (item as Person).Children.Count > 0;
}
}
第5步-最佳步:绑定数据源,并添加虚拟数据! 我们也想刷新我们的观点,我们每一个添加新元素的时间。 这大概可以优化,但我仍然在“噢,我的上帝的工作”区,所以我现在不关心。
// Our Click Action
partial void btnClick (NSObject sender)
{
var p = new Person("John Doe",18);
p.Children.Add(new Person("Jane Doe",10));
var ds = lvMain.DataSource as MyDataSource;
ds.Persons.Add(p);
lvMain.ReloadData();
}
public override void AwakeFromNib ()
{
base.AwakeFromNib ();
lvMain.DataSource = new MyDataSource();
}
我希望这个信息能帮助新人的MonoMac像我这样的困扰的灵魂。
我花了一些时间来追踪下来,但Xamarin对如何做到这一点的例子在这里