我有一个使用 Caliburn.Micro 的 wpf 应用程序。我需要将 ListBox 绑定到对象集合,但我想显示对象的一个字段,并且还想以某种方式将 Guid(另一个字段)附加到每个项目。你能告诉我我该怎么做吗?我不知道 Caliburn.Micro 是否有专门针对它的东西,或者我只需要使用 WPF。
谢谢。
我有一个使用 Caliburn.Micro 的 wpf 应用程序。我需要将 ListBox 绑定到对象集合,但我想显示对象的一个字段,并且还想以某种方式将 Guid(另一个字段)附加到每个项目。你能告诉我我该怎么做吗?我不知道 Caliburn.Micro 是否有专门针对它的东西,或者我只需要使用 WPF。
谢谢。
(对不起,我的英语不好)
如果 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
在这里你可以看到这个运行。
您可以使用每个 ListBox 对象的Tag 属性来存储任意信息。
从链接:
此属性类似于其他 Microsoft 编程模型中的标记属性,例如 Microsoft Visual Basic for Applications (VBA) 或 Windows 窗体。标签旨在提供一个预先存在的属性位置,您可以在其中存储有关任何 FrameworkElement 的一些基本自定义信息,而无需您对元素进行子类化。
由于此属性接受一个对象,因此您需要使用属性元素用法才能将可扩展应用程序标记语言 (XAML) 中的 Tag 属性设置为具有已知和内置类型转换器的对象以外的任何内容,例如细绳。以这种方式使用的对象通常不在标准的 Windows Presentation Foundation (WPF) 命名空间内,因此可能需要将命名空间映射到外部命名空间才能作为 XAML 元素引入。