1

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

谢谢。

4

2 回答 2

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

在这里你可以看到这个运行。

于 2012-06-20T19:59:56.223 回答
1

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

从链接:

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

由于此属性接受一个对象,因此您需要使用属性元素用法才能将可扩展应用程序标记语言 (XAML) 中的 Tag 属性设置为具有已知和内置类型转换器的对象以外的任何内容,例如细绳。以这种方式使用的对象通常不在标准的 Windows Presentation Foundation (WPF) 命名空间内,因此可能需要将命名空间映射到外部命名空间才能作为 XAML 元素引入。

于 2012-06-19T16:59:28.940 回答