我需要具有可共享行为的项目列表。
示例:
Person class
有
List<PhoneNumber>
其中只有一个 PhoneNumber
是 bool IsPrimary
其他物品也一样
有List<EmailAddress>
有List<Address>
想象每个项目(
PhoneNumber
、EmailAddress
、Address
)共享相同的接口ICanBePrimary
,其中包含一个属性bool IsPrimary
的要求,并且当在List<ICanBePrimary>
中时,列表中只有一个项目可以具有IsPrimary
的真实值。
最干净的方法是将列表隐藏在类后面,让您枚举内容,并提供用于识别主要项目的附加方法:
class AddressList : List<Address> {
private int indexOfPrimaryAddress = 0;
public Address PrimaryAddress {
get {
return this[indexOfPrimaryAddress];
}
set {
indexOfPrimaryAddress = this.IndexOf(value);
}
}
// Override more methods to make sure that the index does not become "hanging"
}
更简洁的实现会将列表封装在您的
AddressList
类中,并仅公开您想要公开的方法:
class AddressList : IList<Address> {
private int indexOfPrimaryAddress = 0;
private readonly IList<Address> actualList = new List<Address>();
// Implement the List<Address> by forwarding calls to actualList
}
您可以创建自己的专用集合类,该集合类具有其主要项目的概念。
类似这样的:
public class ListWithPrimary<T> : List<T> {
public bool HasPrimary { get; private set; }
private T primary;
public T Primary
{
get
{
return primary;
}
set
{
if (!Contains(value)) throw new Exception();
primary = value;
}
}
public void AddPrimary(T item)
{
Add(item);
primary = item;
HasPrimary = true;
}
public void ClearPrimary() {
primary = default(T);
HasPrimary = false;
}
....
}
(请注意,上面的内容仍然不完整。您必须维护主要项目始终是列表的一部分的不变量。)
您是否在 Person、EmailAddress 和 Address 类中使用或可以使用 INotifyPropertyChanged?
您真的需要 IsPrimary 属性成为您的类的一部分吗?
如果你这样做
然后您可以监听项目上的所有 PropertyChanged 事件(属于该界面的一部分)并拦截对 IsPrimary 的更改,然后您将检查它是否切换为 ON,然后将所有其他项目上的 IsPrimary 切换为 OFF。
请记住,这是实现您所要求的行为的正确方法。所以是的,这是正确的答案。
PS。如果您只对“CurrentItem”行为感兴趣,您也可以使用 CollectionView 类。