使用对象集合设置列表框项目文本

时间:2015-06-02 11:54:39

标签: c# winforms listbox

问题

我需要能够将Listbox控件项文本设置为泛型对象的属性。

foreach ( GenericObject obj in _genericObjectsCollection )
{
   listbox1.Items.Add( obj );
   listbox1.Items.Text = obj.ItemsText;
}

通用对象类

public class GenericObject
{
   public string ItemsText { get; set; }
   public OtherClass TheOtherGenericClass { get; set; }
}

问题

文字呈现为" myProject.GenericObject"

不是获取text属性,而是简单地呈现对象类型。

我需要什么

要呈现为的文字:

"通用对象1"

的文字

"通用对象2的文本"

以及集合中的每个对象。

最后的话

我知道在使用正确的数据源时,您可以使用listbox控件的display member属性,但在将集合用作数据源时会出现异常。它通知我,复杂的类不能用于完成此任务。

对问题的回答

使用datasource属性时会发生什么?

我使用的代码

    foreach ( GenericObject obj in _genericObjectsCollection  )
    {
        listboxProcessedQuotes.DataSource = obj ;
        listboxProcessedQuotes.DisplayMember = obj.ItemsText;
    }

结果

enter image description here

3 个答案:

答案 0 :(得分:0)

foreach ( GenericObject obj in _genericObjectsCollection )
{
   listbox1.Items.Add( obj.itemsText );
}

如果您还需要能够获取基础选定对象,则可以将其存储在Tag属性中:

foreach ( GenericObject obj in _genericObjectsCollection )
{
   ListBoxItem itm = new ListBoxItem();
   itm.Content = obj.itemsTxt;
   itm.Tag = obj;
   listbox1.Items.Add(itm);
}

然后,当您获得所选的列表框项目时,您可以执行以下操作:

itm.Tag as GenericObject

答案 1 :(得分:0)

我很好奇你是如何尝试为列表框做显示成员路径的。这真的应该是可能的。这是一个简单的例子:

//xaml
<ListBox x:Name="ListBox" DisplayMemberPath="MyStringProperty"/>

//code behind
 public partial class MainWindow : Window
 {
    public MainWindow()
    {
        InitializeComponent();
        this.LoadItems();
    }

    private void LoadItems()
    {
        ListBox.Items.Add(new MyListItem() { MyBoolProperty = true, MyStringProperty = "Hello" });
        ListBox.Items.Add(new MyListItem() { MyBoolProperty = false, MyStringProperty = "World" });
    }
}

//my object class
public class MyListItem : NotificationObject
{
    private string _myString;
    private bool _myBool;

    public MyListItem()
    { }

    public string MyStringProperty
    {
        get { return _myString; }
        set
        {
            _myString = value;
            this.RaisePropertyChanged("MyStringProperty");
        }
    }

    public bool MyBoolProperty
    {
        get { return _myBool; }
        set
        {
            _myBool = value;
            this.RaisePropertyChanged("MyBoolProperty");
        }
    }
}

答案 2 :(得分:0)

这是GenericObject应该如何:

public class GenericObject
{
    private string _itemsText;
    public string itemsText
    {
        get { return _itemsText; }
        set { _itemsText = value; }
    }
}

然后创建自定义对象的简单列表,并将其添加到ItemsSource的{​​{1}}:

ListBox

注意List<GenericObject> l = new List<GenericObject>(); l.Add(new GenericObject() { itemsText = "test1" }); l.Add(new GenericObject() { itemsText = "test2" }); list1.ItemsSource = l; 的XAML声明,我正在使用绑定:

ItemTemplate

我建议阅读有关数据绑定的更多信息,这非常有用。 https://msdn.microsoft.com/en-us/library/ms750612%28v=vs.110%29.aspx