我有一个ListBox,其ItemSource是一个ObjectDataProvider,它是ObservableCollection的一个实例。 ObservableCollection是ObservableCollections的集合。 ListBox的ItemTemplate是一个DataTemplate,它为列表框的每个项目创建一个ListBox。为了更好地说明这一点,我试图在WPF中重新创建一个纸牌游戏。基本上,从一手卡片,你可以创建书籍。获得有效的书籍后,您可以选择将其作为一本书进入ObservableCollection of Books。我遇到的问题是ListBox的每个项目都是一个ListBox,它有一个BookSource,它是一个Book的ObservableCollection。我不认为我对外部ListBox的源代码或模板有问题,但我很难理解我将如何将ListBox项目的源设置为卡片集合每本书。从本质上讲,我的问题可能是令人困惑和难以理解的概念,但实质上我正试图弄清楚如何在模板中使用ListBox,该模板将成为另一个ListBox的模板。如果有人知道如何处理这个问题,我将非常感谢听到它。
答案 0 :(得分:4)
使用以下卡片:
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,但你可以做任何你需要的。
答案 1 :(得分:2)
不要将ListBox放在ListBox中,它会创建一个非常令人困惑的UI,因为你将有几个选定项目的“级别”。
如果您需要一个ListBox,其中每个项目内都有一个集合,或者如果您需要多个列表框,则可以在ItemsControl中使用ListBox,将ItemsControl放在ListBox中。
答案 2 :(得分:0)
感谢您的回复。虽然我同意这两个回复,并且总是欣赏被告知错误的编码实践,但第一个答案就是诀窍。我在DataTemplate中遇到了ListBox的ItemsSource问题。在学习WPF的过程中,我开始喜欢使用ObjectDataProvider作为我的ItemsSource。由于ObjectDataProvider只是集合的一个实例,当我更新它时,我所有“书籍”的卡片来源都是一样的。将我的ItemsSource绑定源直接更改为可观察的集合“Cards”就可以了。
尽管在UI方面可能会让人感到困惑,但我不确定我是否会允许任何一个列表中的项目可供选择。我的意图仅仅是对球员书籍的直观表现。我可能需要允许外部列表中的项目可以选择,以便能够从一本书中移动卡片并返回主手,但我还不确定。
再次感谢您的帮助。
谢谢, 布兰登