Domanda

Ho una casella di riepilogo che contiene un elenco di elementi di lavoro (da TFS). Voglio aggiungere elementi da selezionare, ma non riesce a identificare gli elementi come lo stesso.

Ecco il mio codice

    public void SelectQueryResultItem(WorkItem item)
    {
        lstQueryResults.SelectedItems.Add(item);
    }

Questa grande opera in cui l'elemento di lavoro passato è dalla stessa query che è nella lista SelectedItems. Tuttavia se venisse da una query diversa (cioè il riferimento all'oggetto non è lo stesso), allora non identifica l'oggetto correttamente.

suppongo che è il confronto sul riferimento. Voglio ignorare che e renderla confrontare su item.Id. C'è un modo per farlo?

Si noti che sto usando la WPF ListBox , non il WinForms ListBox

È stato utile?

Soluzione

Piuttosto che eredita da ListBox, hai provato prioritario è pari, in classe WorkItem di fare un confronto con ID? Non è l'ideale in quanto, ovviamente, due casi con lo stesso ID non sono necessariamente uguali. Ma io non sono sicuro di come si potrebbe convincere la classe di base di selezione in utilizzando un IComparer personalizzato.

EDIT Ho scavato in un po 'più profonda e ha scoperto che è possibile derivare da CollectionView (che è un wrapper per una collezione di essere vincolato in WPF) e ignorare la sua proprietà Comparer per restituire un IComparer personalizzato. Così si potrebbe creare qualcosa come un WorkItemCollectionView che prevale Comparer e restituire qualcosa come un WorkItemIDComparer.

Spero che questo aiuti.

Altri suggerimenti

Ecco un modo non-cool per risolvere questo problema.

    public void SelectQueryResultItem(WorkItem item)
    {
        // Because the ListBox only compares by reference, 
        //  we need to find the matching WorkItem (if any)
        //  before adding it to the selected list.
        WorkItem matchingWorkItemInList = GetWorkItemInQueryResultByID(item.Id);
        if (matchingWorkItemInList != null)
            lstQueryResults.SelectedItems.Add(matchingWorkItemInList);
    }

    public WorkItem GetWorkItemInQueryResultListByID(int Id)
    {
        foreach (WorkItem workItem in lstQueryResults.Items)
        {
            if (workItem.Id == Id)
            {
                return workItem;
            }
        }
        return null;
    }

In sostanza sto eludere il sistema di confronto nella casella di riepilogo.

Sarebbe bello se WPF mi ha permesso di avere accesso al l'operatore di confronto in modo da poter confrontare per valore se voglio e non ha bisogno di fare questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top