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