簡體   English   中英

從內部操縱集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM