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