如何将WPF中的列表框绑定到通用列表?

时间:2010-11-11 13:44:07

标签: c# wpf listbox

我无法为此获得明确的答案。 我有一个静态类(DataHolder),它包含一个复杂类型的静态列表(CustomerName和CustomerID属性)。 我想将它绑定到WPF中的ListBox,但添加另一个将具有单词“All”的项目,以用于将来的拖放功能。 任何人吗?

3 个答案:

答案 0 :(得分:2)

创建一个可以数据绑定到的ViewModel类! ViewModel可以引用静态类并将项目复制到自己的集合中,并将所有项目添加到其中。

喜欢这个

public class YourViewModel
{
        public virtual ObservableCollection<YourComplexType> YourCollection
        {
            get
            {
                var list = new ObservableCollection<YourComplexType>(YourStaticClass.YourList);
                var allEntity = new YourComplexType();

                allEntity.Name = "all";
                allEntity.Id = 0;

                list.Insert(0, allEntity);

                return list;
            }

        }
}

注意,有时候,你需要空物品。由于WPF无法数据绑定为空值,因此您需要使用相同的方法来处理它。空业务实体是最佳实践。只是谷歌吧。

答案 1 :(得分:1)

“All”项必须是绑定ListBox的列表的一部分。通常,您无法将该项添加到DataHolder列表,因为它包含Customer(或类似)类型的项。你当然可以添加一个“魔术”客户,它总是充当“全部”项目,但这显然是一个严重的设计气味案例(毕竟是一个客户列表)。

你可以做的是不直接绑定DataHolder列表,而是引入一个包装器。这个包装器将是你的ViewModel。您将再次将ListBox绑定到CustomerListItemViewModel列表中,该列表表示Customer或“All”项。

CustomerViewModel
{
    string Id { get; private set; }
    string Name { get; set; }
    public static readonly CustomerViewModel All { get; private set; }

    static CustomerViewModel()
    {
       // set up the one and only "All" item
       All = new CustomerViewModel();
       All.Name = ResourceStrings.All;
    }


    private CustomerViewModel()
    {
    }

    public CustomerViewModel(Customer actualCustomer)
    {
        this.Name = actualCustomer.Name;
        this.Id = actualCustomer.Id;
    }
}

someOtherViewModel.Customers = new ObservableCollection<CustomerViewModel>();
// add all the wrapping CustomerViewModel instances to the collection
someOtherViewModel.Customers.Add(CustomerViewModel.All);

然后在ViewModel中的Drag&amp; Drop代码中显示:

if(tragetCustomerViewModelItem = CustomerViewModel.All)
{
     // something was dropped to the "All" item
}

我可能刚刚向您介绍了WPF中MVVM的好处。从长远来看,它可以为您节省很多麻烦。

答案 2 :(得分:0)

如果使用绑定而不是提供的数据,因为源必须保存所有项目,即。你不能数据绑定,然后在列表中添加另一个项目。

您应该将“All”项添加到DataHolder集合中,并在代码中单独处理“All”项。