1

我有一个 ListBox,它的 ItemSource 是一个 ObjectDataProvider,它是 ObservableCollection 的一个实例。ObservableCollection 是 ObservableCollections 的集合。ListBox 的 ItemTemplate 是一个 DataTemplate,它为列表框的每个项目创建一个 ListBox。为了更好地说明这一点,我试图在 WPF 中重新创建一个纸牌游戏。基本上,您可以从一手牌中创建书籍。在你拥有一本有效的书后,你可以选择将它制作成一本将进入 ObservableCollection 的书。我遇到的问题是 ListBox 的每个项目都是一个 ListBox,它的 ItemSource 是一本书,即卡片的 ObservableCollection。我认为外部 ListBox 的源或模板没有问题,但我很难理解我是如何做到的 m 将 ListBox 项目的来源设置为每本书的卡片集合。从本质上讲,我的问题可能令人困惑并且是一个难以掌握的概念,但基本上我试图弄清楚如何在将成为另一个 ListBox 模板的模板中使用 ListBox。如果有人知道如何解决这个问题,我将不胜感激。

4

3 回答 3

4

使用 Card 如下所示:

 public class Card
{

    private string _name;

    public Card(string name)
    {
        _name = name;
    }


    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

和预订如下:

public class Book
{
    private readonly ObservableCollection<Card> _cards;

    public Book(ObservableCollection<Card> cards)
    {
        _cards = cards;
    }


    public ObservableCollection<Card> Cards
    {
        get { return _cards; }
    }
}

然后在窗口中创建您的 ListBox:

<ListBox
        ItemsSource="{Binding ElementName=Window, Path=Books}"
        ItemTemplate="{StaticResource MainListTemplate}" />

并在窗口的资源中放置:

<Window.Resources>
    <ResourceDictionary>

        <DataTemplate
            x:Key="InsideListTemplate">
            <TextBlock
                Text="{Binding Name}" />

        </DataTemplate>

        <DataTemplate
            x:Key="MainListTemplate">
            <ListBox
                ItemsSource="{Binding Cards}"
                ItemTemplate="{StaticResource InsideListTemplate}" />

        </DataTemplate>



    </ResourceDictionary>
</Window.Resources>

您的 ListBox 使用 MainListTemplate,其中包含一个 ListBox。该 ListBox 的 ItemsSource 是您的卡片列表,而 ItemTemplate 是 InsideListTemplate。我把它当作一个简单的 TextBlock 但你可以做任何你需要的事情。

于 2008-12-09T00:08:52.493 回答
2

不要将 ListBox 放在 ListBox 中,这将创建一个非常混乱的 UI,因为您将拥有多个“级别”的选定项目。

如果您需要单个 ListBox,每个项目内都有一个集合,则可以将 ItemsControl 放在 ListBox 内;如果需要多个列表框,则可以将 ListBox 放在 ItemsControl 内。

于 2008-12-09T08:57:06.967 回答
0

感谢您的回复。虽然我确实同意这两种回答,并且总是很高兴收到有关不良编码实践的通知,但第一个答案确实起到了作用。我的 DataTemplate 中的 ListBox 的 ItemsSource 有问题。在学习 WPF 的过程中,我迷上了使用 ObjectDataProvider(s) 作为我的 ItemsSource。由于 ObjectDataProvider 只是集合的一个实例,当我更新它时,我所有“书籍”的卡片来源都是相同的。将我的 ItemsSource 绑定源直接更改为可观察的集合“Cards”就可以了。

尽管在 UI 方面可能会令人困惑,但我不确定我是否会允许选择任一列表中的项目。我的意图仅仅是为了球员书籍的视觉表现。我可能需要允许外部列表中的项目可以选择,以便能够将卡片从书中移回主手,但我还不确定。

再次感谢您的帮助。

谢谢,布兰登

于 2008-12-09T15:50:53.920 回答