我不清楚你的問題的後半部分。部分原因是因爲你的命名約定很混亂;我期望名爲BItems
的集合包含B
類型的對象,而不是A
。
所以我會改變你的命名,以免混淆。而不是A
,我會打電話給第一類User
,而不是B
,我會打電話給第二類Group
。 A Group
包含一組User
對象,名爲Users
。全球集合是這樣的:
List<User> Users;
List<Group> Groups;
可以很容易地確定給定User
u
是在任何一組:
return Groups.Where(g => g.Users.Contains(u)).Any();
容易,但計算量很大,如果你有許多團體和它們包含許多用戶。我們會在一秒鐘之內回到這一點。
馬上,我看到您的問題一個也有一個問題:
我怎麼能作出這樣的勾選複選框插入其項目的BItems收集和取消選中刪除呢?
如果我檢查一個未經檢查的用戶會發生什麼?哪些組(或多個組,由於多個組可以包含用戶)是否應該添加到?
既然你說你希望檢查項目被「分配給B對象」,那麼我將假設用戶界面一次只查看一個組 - 我們將其稱爲SelectedGroup
。這很好,因爲g.Users.Contains(u)
比我上面顯示的查詢便宜得多。
如果是這樣,你需要做的是將User
包裝在一個公開IsChecked
屬性的類中。我會叫這個類UserViewModel
,因爲這就是它。這個班的三個屬性(至少):
public User User { get; set; }
public Group SelectedGroup { get; set; }
public bool IsChecked
{
get { return SelectedGroup.Users.Contains(this.User); }
set
{
if (value != IsChecked)
{
if (IsChecked)
{
SelectedGroup.Users.Remove(this.User);
}
else
{
SelectedGroup.Users.Add(this.User);
}
}
}
}
你ListView
綁定到一個名爲ObservableCollection<UserViewModel>
,比如說,UserViewModels
。每當SelectedGroup
設置,您需要重新構建這個集合:
UserViewModels = new ObservableCollection<UserViewModel>(
Users.Select(u => new UserViewModel { User=u, SelectedGroup=SelectedGroup }));
你可能避免在UserViewModel
類實現INotifyPropertyChanged
,並讓它提高PropertyChanged
爲IsChecked
財產每當SelectedGroup
變化重建集合。
此外,它可能會負責在IsChecked
屬性中包含空引用檢查,以便程序在SelectedGroup
或SelectedGroup.Users
爲空時不會拋出異常。
對不起,我混亂的命名約定。謝謝,這正是我正在尋找的。我的GUI確實總是隻顯示一個'組'。 :-) – 2011-02-14 20:04:01