[英]Manipulating collection from the inside
我有一組面板,當用戶單擊它們時,這些面板會突出顯示。 我想強迫它們表現為一組單選按鈕,因此僅高亮顯示了被單擊的按鈕,而其他按鈕則沒有。
我猜必須有一種從內部操縱整個集合(將屬性設置為false)的方法,因為該事件是由集合中的一項觸發的。 有沒有一種方法可以操縱整個收藏夾? 這是應用程序中如此常見的功能,因此我想必須有一種模式來正確執行此操作。 謝謝。
您可以存儲面板的集合並處理所需的功能,如以下代碼片段所示:
List<Panel> Panels;
private void Initialization()
{
Panels = new List<Panel>();
Panels.Add(pnl1);
Panels.Add(pnl2);
//add all your panels into collection
foreach(Panel Item in this.Panels)
{
//add handle to panel on click event
Item.Click += OnPanelClick;
}
}
private void OnPanelClick(object sender, EventArgs e)
{
foreach(Panel Item in this.Panels)
{
//remove highlight from your panels, real property should have other name than Panel.HighlightEnabled
Item.HighlightEnabled = false;
}
((Panel)sender).HighlightEnabled = true; //add highlight to Panel which invoked Click event
Application.DoEvents(); //ensure that graphics redraw is completed immediately
}
private void AddNewPanelIntoLocalCollection(Panel panel)
{
//here you can add new items to collection during program lifecycle
panel.Click += OnPanelClick;
this.Panels.Add(panel);
}
這就是我的方法
public class SelectOne : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private bool isSelected = false;
private HashSet<SelectOne> selecteOnes = null;
public bool IsSelected
{
get { return isSelected; }
set
{
if (isSelected == value) return;
if (isSelected && selecteOnes != null)
{
foreach (SelectOne so in selecteOnes)
{
if (so == this) continue;
so.IsSelected = false;
}
}
NotifyPropertyChanged("IsSelected");
}
}
public SelectOne() { }
public SelectOne(bool IsSelected) { isSelected = IsSelected; }
public SelectedOne(bool IsSelected, HashSet<SelectOne> SelecteOnes)
{
isSelected = IsSelected;
selecteOnes = SelecteOnes;
}
}
最終,我確實找到了一種僅由一名代表正確完成此操作的方法。
AI類中有對象B的集合
List<B> b = new List<B>
B類,需要具有唯一的ID和ID參數為空方法的delegete
delegate void DeleteItemDelegate(int id);
class B
{
public int ID {get; set;}
public DeleteItemDeleate deleteThis {set; get;}
}
A類的方法如下:
public void RemoveItem(int id)
{
for (int x = 0; x < b.Count; x++)
{
if (b[x].id == id)
{
b.RemoveAt(x);
}
}
}
當向列表中添加新的B對象時,只需將方法RemoveItem添加到B.deleteThis委托中
B bObject = new B();
bObject.deleteThis = RemoveItem;
b.Add(bObject);
現在您需要做的就是在B類中添加DeleteMe方法
void DeleteMe()
{
// and call local delegate - pointing to metod which actually can manipulate the collection
deleteThis(id);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.