2011-05-31 23 views
6

¿Cuál es la mejor manera de vincular el elemento ListView con un objeto para que cuando mueva el elemento de una vista de lista a otro, yo todavía podría decir a qué objeto está asignado. Por ejemplo, tengo el objeto Cards Todos estos se enumeran en un allCardsListView. Tengo otro selectedCardsListView y un botón que mueve los elementos seleccionados de una vista de lista a otra. Cuando hice mi selección, necesito obtener la lista de los objetos Card que se movieron al selectedCards ListView.C# Tie ListView items with objects

+0

Esta pregunta no es muy clara. Si movió esos objetos a 'selectedCards', ¿no es esa la lista que desea? –

+0

@Steven: en ListView solo aparecen los nombres de las Tarjetas. – hs2d

+0

Solo una pequeña sugerencia, sería más claro si cambiaras el nombre de todas las Tarjetas * a las Tarjetas disponibles * ... –

Respuesta

5

Para ampliar @ respuesta de CharithJ, esto es como se puede utilizar la propiedad de la etiqueta:

ListView allCardsListView = new ListView(); 
    ListView selectedCardsListView = new ListView(); 
    List<Card> allCards = new List<Card>(); 
    List<Card> selectedCards = new List<Card>(); 
    public Form1() 
    { 
     InitializeComponent(); 


     foreach (Card selectedCard in selectedCards) 
     { 
      ListViewItem item = new ListViewItem(selectedCard.Name); 
      item.Tag = selectedCard; 
      selectedCardsListView.Items.Add(item); 
     } 
     foreach (Card card in allCards) 
     { 
      ListViewItem item = new ListViewItem(card.Name); 
      item.Tag = card; 
      allCardsListView.Items.Add(new ListViewItem(card.Name)); 
     } 

     Button button = new Button(); 
     button.Click += new EventHandler(MoveSelectedClick); 
    } 

    void MoveSelectedClick(object sender, EventArgs e) 
    { 
     foreach (ListViewItem item in allCardsListView.SelectedItems) 
     { 
      Card card = (Card) item.Tag; 
      //Do whatever with the card 
     } 
    } 

Obviamente tendrá que adaptarlo a su propio código, pero que debe empezar .

+0

Sé que esta respuesta es vieja, pero esto fue *** EXACTAMENTE *** lo que estaba buscando. Nunca conocí la propiedad 'Tag', ni lo que hacía ni para qué era, así que muchas gracias: D – Nolonar

1

1st way.

Asigne el objeto a la propiedad Tag del ListViewItem. Obtén las etiquetas de los elementos seleccionados.

2nd Way.

Agregue el subItem invisible a la lista de lista que contiene el ID del objeto de la Tarjeta. Luego encuentra la tarjeta usando los ID de los ítems seleccionados.

5

Puede usar colecciones observables y crear una plantilla de datos para su clase Card. Luego, simplemente une su ListView a la colección y hace todo el trabajo por usted. Cuando agrega un artículo al ObservableCollection, el ListView se vuelve a dibujar automáticamente.

using System.Collections.ObjectModel; 

<ListView Name="allCardsView" Source="{Binding}"> 
    <ListView.ItemTemplate> 
     <DataTemplate DataType="{x:Type yourXmlns:Card}"> 
      //Your template here 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
<ListView Name="selectedCardsView" Source="{Binding}"> 
    <ListView.ItemTemplate> 
     <DataTemplate DataType="{x:Type yourXmlns:Card}"> 
      //Your template here 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

ObservableCollection<Card> allCards = new ObservableCollection<Card>(); 
ObservableCollection<Card> selectedCards = new ObservableCollection<Card>(); 
allCardsView.DataContext = allCards; 
selectedCardsView.DataContext = selectedCards; 


public void ButtonClickHandler(object sender, EventArgs e) 
{ 
    if (allCardsView.SelectedItem != null && 
     !selectedCards.Contains(allCardsView.SelectedItem)) 
    { 
     selectedCards.Add(allCardsView.SelectedItem); 
    } 
} 
+0

Lo siento, olvidé decir que estoy usando WinForms. – hs2d

1

Mejor uso ObjectListView. Es una forma perfecta de agregar y usar objetos con ListView. Con funciones como Hot tracking y fácil de usar, arrastrar y soltar su lista de listas se vuelve mucho más simple de manipular.