我有一个 ListBox,它的 ItemSource 是一个 ObjectDataProvider,它是 ObservableCollection 的一个实例。ObservableCollection 是 ObservableCollections 的集合。ListBox 的 ItemTemplate 是一个 DataTemplate,它为列表框的每个项目创建一个 ListBox。为了更好地说明这一点,我试图在 WPF 中重新创建一个纸牌游戏。基本上,您可以从一手牌中创建书籍。在你拥有一本有效的书后,你可以选择将它制作成一本将进入 ObservableCollection 的书。我遇到的问题是 ListBox 的每个项目都是一个 ListBox,它的 ItemSource 是一本书,即卡片的 ObservableCollection。我认为外部 ListBox 的源或模板没有问题,但我很难理解我是如何做到的 m 将 ListBox 项目的来源设置为每本书的卡片集合。从本质上讲,我的问题可能令人困惑并且是一个难以掌握的概念,但基本上我试图弄清楚如何在将成为另一个 ListBox 模板的模板中使用 ListBox。如果有人知道如何解决这个问题,我将不胜感激。
3 回答
使用 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 但你可以做任何你需要的事情。
不要将 ListBox 放在 ListBox 中,这将创建一个非常混乱的 UI,因为您将拥有多个“级别”的选定项目。
如果您需要单个 ListBox,每个项目内都有一个集合,则可以将 ItemsControl 放在 ListBox 内;如果需要多个列表框,则可以将 ListBox 放在 ItemsControl 内。
感谢您的回复。虽然我确实同意这两种回答,并且总是很高兴收到有关不良编码实践的通知,但第一个答案确实起到了作用。我的 DataTemplate 中的 ListBox 的 ItemsSource 有问题。在学习 WPF 的过程中,我迷上了使用 ObjectDataProvider(s) 作为我的 ItemsSource。由于 ObjectDataProvider 只是集合的一个实例,当我更新它时,我所有“书籍”的卡片来源都是相同的。将我的 ItemsSource 绑定源直接更改为可观察的集合“Cards”就可以了。
尽管在 UI 方面可能会令人困惑,但我不确定我是否会允许选择任一列表中的项目。我的意图仅仅是为了球员书籍的视觉表现。我可能需要允许外部列表中的项目可以选择,以便能够将卡片从书中移回主手,但我还不确定。
再次感谢您的帮助。
谢谢,布兰登