如何在列表框中存储其他数据?

时间:2012-06-19 16:55:31

标签: wpf caliburn.micro

我有一个使用Caliburn.Micro的wpf应用程序。我需要将ListBox绑定到一个对象集合,但我想显示一个对象的字段,并且还要以某种方式将Guid(另一个字段)附加到每个项目。你能告诉我怎么做吗?我不知道Caliburn.Micro是否有特定的东西,或者我只需要使用WPF。

感谢。

2 个答案:

答案 0 :(得分:2)

(抱歉我的英语不好)

如果Guid字段是对象的一部分,则无需将其存储在其他位置。列表框将显示一个字段,但它仍然与原始对象绑定,您可以使用((MyObjectType)MyListBox.SelectedItem).Guid获取它。使用Caliburn它更加容易,因为您只需要将VM上的属性绑定到SelectedItem。

但是如果Guid 不是你对象的一部分,你可以使用Tag属性,正如Paul Sasik所说。我不喜欢使用Tag属性,因此这是另一种简单(且更灵活)的方法,您需要将对象封装在另一个对象上:

public class GuidObject<T>
{
    public T Instance {get;set;}
    public Guid Guid {get;set;}
}

你可以像这样使用它:

//this is your original guidless items list
var myObjectsList = new[] { new MyObject { Name = "Dostoyevsky" }, 
                            new MyObject { Name = "Ozzy" } };

var myObjectsWithGuidList = new ObservableCollection<GuidObject<MyObject>>();

//encapsulate each MyObject on a GuidObject and include a Guid
//if your myObjectsList is already a List, you do not need to call ToList()
myObjectsList.ToList().ForEach(o => myObjectsWithGuidList.Add(new GuidObject<MyObject>() { Instance = o, Guid = Guid.NewGuid() }));

//now myObjectsWithGuidList contains a list of your itens and a Guid field, you can bind it to your ListBox

Here你可以看到这种情况正在发生。

答案 1 :(得分:1)

您可以使用每个ListBox对象的Tag property来存储任意信息。

从链接:

  

此属性类似于其他Microsoft中的Tag属性   编程模型,例如Microsoft Visual Basic for Applications   (VBA)或Windows窗体。标签旨在提供预先存在的   属性位置,您可以存储一些基本的自定义信息   关于任何FrameworkElement而不要求你子类化   元件。

     

因为此属性需要一个对象,所以您需要使用   property元素用法,以便在Extensible中设置Tag属性   应用程序标记语言(XAML)到对象以外的任何其他语言   使用已知的内置类型转换器,例如字符串。对象   以这种方式使用通常不在标准Windows中   Presentation Foundation(WPF)命名空间因此可能需要   命名空间映射到外部命名空间以便引入   作为XAML元素。