Mono GTK#树状视图分层数据显示

Mono GTK#树状视图分层数据显示,mono,gtk#,gtktreeview,Mono,Gtk#,Gtktreeview,我目前正在与mono和gtk合作。 关于树视图,有这样一个。 我想实现“控制模型的使用方式”中所述的相同目标 所以我有歌曲类和渲染方法来显示艺术家和标题 但是我想通过树存储而不是列表存储来显示它。所以每个字母都有一个根节点,在这个节点下,所有以这个字母开头的艺术家都应该显示出来 我的问题是如何将这些根节点添加到TreeStore?我应该在哪里添加它们 songs.Add(new Song("Dancing Djs vs. Roxette", "Fading like a flower")); s

我目前正在与mono和gtk合作。 关于树视图,有这样一个。 我想实现“控制模型的使用方式”中所述的相同目标 所以我有歌曲类和渲染方法来显示艺术家和标题

但是我想通过树存储而不是列表存储来显示它。所以每个字母都有一个根节点,在这个节点下,所有以这个字母开头的艺术家都应该显示出来

我的问题是如何将这些根节点添加到TreeStore?我应该在哪里添加它们

songs.Add(new Song("Dancing Djs vs. Roxette", "Fading like a flower"));
songs.Add(new Song("Xaiver","give me the right"));
songs.Add(new Song("Daft Punkt","Technologic"));

TreeStore musicListStore = new TreeStore(typeof(Song));
foreach (var s in songs) 
{
    musicListStore.AppendValues(s);
}

treeview1.Model = musicListStore;

treeview1.AppendColumn("Artist", new CellRendererText(),new TreeCellDataFunc(RenderArtistName));
treeview1.AppendColumn("Title", new CellRendererText(),new TreeCellDataFunc(RenderSongTitle));

private void RenderArtistName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
{
    Song s = model.GetValue(iter,0) as Song;
    (cell as CellRendererText).Text = s.Artist;
}

private void RenderSongTitle(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
{
    Song s = model.GetValue(iter,0) as Song;
    (cell as CellRendererText).Text = s.Title;
}
所以我想实现每个字母都有根节点,每个字母下面都应该列出所有艺术家,从这个字母开始

我的问题是如何将字母添加到树顶,以及如何知道在何处插入每首歌曲

下面是我希望它看起来像的屏幕截图(我不允许直接上传它们,所以我必须使用外部托管的.Sry):

你可以很容易地建树。Eg

var store = new Gtk.TreeStore( typeof(string) );

// add a root node
var root = store.AppendValues("hello"); 

// add a child of the root
store.AppendValues(root,"world");

// add another child
var mono = store.AppendValues(root,"mono");

// add a second level child
store.AppendValues(mono,"gtk");
因此,在你的音乐应用程序中

// title, artist
var store = new Gtk.TreeStore( typeof(string), typeof(string) );

// make an index of top level nodes using thier TreeIters
var index = new Dictionary<string,Gtk.TreeIter>();

// add index nodes
foreach ( var letter in new List<string>{ "A", "B", "C" ... "Z" } ){
    index[letter.ToLower()] = store.AppendValues( letter );
}

// add songs
foreach ( var song in songlist ){
    var title = song.Title;
    var artist = song.Artist;

    var first = title.SubString(0,1).ToLower();
    var iter = store[first];

    // add this song
    store.AppendValues( iter, title, artist );
}
//标题,艺术家
var store=new Gtk.TreeStore(typeof(string),typeof(string));
//使用它们的树创建顶级节点的索引
var index=newdictionary();
//添加索引节点
foreach(新列表中的var字母{“A”、“B”、“C”…“Z”}){
索引[letter.ToLower()]=存储.appendValue(letter);
}
//添加歌曲
foreach(歌曲列表中的var song){
var title=song.title;
var-artist=song.artist;
var first=title.SubString(0,1.ToLower();
var iter=存储[第一];
//添加这首歌
存储。附加值(iter、标题、艺术家);
}

如果要动态添加索引节点,您必须做一些额外的工作,每次在某个级别添加节点时,该级别或更高级别的所有treeiter值都将变得毫无价值。

到目前为止,您有一些代码可以向我们展示吗?谢谢,我知道并已经这样使用过了。我的TreeStore是Song类型,我使用TreeCellDataFunc。这是我的密码:谢谢。这样就行了。它是Gtk.TreeStore(typeof(string),typeof(string)),但我更喜欢使用typeof(Song),因为我有几个列与TreeCellDataFunc连接在一起,我还做了很多事情。比如设置一个pixbuf,改变颜色,划掉等等,这些都是在我的TreeCellDataFunc中完成的。这有点酷,因为我不必自己建造整个树顶。所以基本上我是在问是否有一种方便的方式使用typeof(Song)并按层次显示数据