Gtk#:ComboBoxEntry对象的ListStore

时间:2015-01-17 15:40:03

标签: c# combobox mono cross-platform gtk#

我有一些数据存储区,包含一些字段(例如field1,field2等),我想在ComboBoxEntry中显示该类的List。我为IEnumerable创建了扩展方法:

public static ListStore ToListStore<T>(this IEnumerable<T> Parent)
        {
            ListStore returnedValue = new ListStore(typeof (object));
            //ListStore returnedValue = new ListStore (typeof(string));

            if (Parent != null) 
            {
                foreach (T node in Parent) 
                {
                    returnedValue.AppendValues (node);
                    //next two lines is just for testing.
                    TreeIter hello;
                    bool res = returnedValue.GetIterFirst (out hello);
                }
            }

            return returnedValue;
        }

我按下一个方式填写ComboBoxEntry:

public static void SetGenericModel<T>(this ComboBox Parent, IEnumerable<T> Model, CellLayoutDataFunc LayoutFuncForModel)
        {
            ListStore store = Model.ToListStore ();
            /*ListStore store = new ListStore (typeof(string));
            store.AppendValues("a");
            store.AppendValues("b");*/

            CellRendererText genericClassCell = new CellRendererText();
            //Parent.Clear ();
            Parent.PackStart(genericClassCell, true);
            Parent.SetCellDataFunc(genericClassCell, LayoutFuncForModel);
            TreeIter treeIter;
            store.GetIterFirst (out treeIter);
            Parent.Model = store;

            /*int columnsCount = Parent.Model.NColumns;

            Parent.Model.GetIterFirst (out treeIter);
            object obj = Parent.Model.GetValue (treeIter, columnsCount - 1);
            Parent.Clear ();*/
        }

好的,输出工作正常,但是当我尝试选择ComboBoxEntry的某些项目时,我的应用程序崩溃而没有一些例外,只有输出窗口包含一些信息:*“(MyAppName:14822):GLib-GObject-WARNING ** :无法从类型'GtkSharpValue'“*的值设置'gchararray'类型的属性'text'。但是如果我创建ListStore作为字符串(注释代码):

ListStore store = new ListStore (typeof(string));
                store.AppendValues("a");
                store.AppendValues("b");
然后总是工作得很好。 我的代码出了什么问题,如何解决这个问题(我应该用我的对象填充ComboBoxEntry,因为当用户选择某个项目时,我应该将其作为数据存储项处理)?

1 个答案:

答案 0 :(得分:0)

我认为ComboboxEntry总是希望默认情况下第一列是文本。也许这可以通过一些技巧来覆盖。但似乎合乎逻辑的是,文本条目期望值是文本,而不是图标或其他任何内容......

现在,我知道Combobox(基类)默认情况下第一列为文本。您注释掉了这行代码:

Parent.Clear ();

让您清除任何默认设置并打包自己的渲染器。

下一步是当你想要阅读Combobox的内容时,你必须使用TreeIter检索值,如下所示:

TreeIter iter;

if (Combo.GetActiveIter(out iter))
{
    var value = (YourClass)this.Combo.Model.GetValue(iter, 0);
}