C#并列列表查看带有对象的项

本文关键字:对象 列表 | 更新日期: 2023-09-27 17:58:07

将ListView项与对象绑定的最佳方式是什么?因此,当我将项从一个列表视图移动到另一个列表时,我仍然可以告诉它分配了什么对象。例如,我有对象Cards。所有这些都列在allCards ListView中。我有另一个selectedCards ListView和一个按钮,它可以将所选项目从一个列表视图移动到另一个。当我完成选择时,我需要获得移动到selectedCards ListView的Card对象的列表。

C#并列列表查看带有对象的项

要扩展@CharithJ的答案,以下是如何使用标记属性:

    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
        }
    }

显然,您需要将其调整为适合自己的代码,但这应该会让您开始。

您可以使用可观察的集合,并为Card类创建一个数据模板。然后,您只需将ListView绑定到集合,它就可以为您完成所有工作。当您将项目添加到ObservableCollection时,ListView会自动重新绘制。

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);
    }
}

第1种方式。

将对象指定给ListViewItem的Tag属性。获取所选项目的标记。

第二条路。

将不可见的子项添加到包含Card对象ID的listView中。然后使用选定的物品ID找到卡片。

更好地使用ObjectListView。这是通过ListView添加和使用对象的完美方式。有了热跟踪和易于使用的拖放等功能,列表视图的操作变得简单多了。