WPF - 非常基本的 ListBox.ItemTemplate 问题
好吧,这是一个看似简单得令人尴尬的问题,但却让我发疯。我正在学习 DataTemplate,并尝试将一个非常非常简单的 ItemTemplate 应用于 ListBox。
然而,当我运行我的应用程序时,模板被完全忽略,我只得到标准外观的列表框,而实际上我希望看到旁边带有“测试”的复选框列表。
我已经尝试过几次并且总是相同的结果。我已经检查了 Google 上的几个资源,并且所有资源都具有相同类型的用于在 ListBox 上定义 ItemTemplate 的语法,所以我真的看不出哪里出错了。
代码...
<Grid x:Name="LayoutRoot">
<ListBox x:Name="TestList"
SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<CheckBox Content="Check this checkbox!"/>
<TextBlock>Test</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Items>
<ListBoxItem>Bob</ListBoxItem>
<ListBoxItem>Jim</ListBoxItem>
<ListBoxItem>Dave</ListBoxItem>
<ListBoxItem>Larry</ListBoxItem>
<ListBoxItem>Tom</ListBoxItem>
</ListBox.Items>
</ListBox>
</Grid>
非常感谢任何帮助。很抱歉问了这样一个看似愚蠢的问题,但我真的在第一个障碍处就跌倒了:(
AT
Ok, this is an embarassingly simple-looking problem, but is driving me crazy. I'm learning about DataTemplating and am trying to apply a very VERY simple ItemTemplate to a ListBox.
However, when I run my app, the template is completely ignored and I just get the standard-looking listbox, whereas in fact I'd expect to see a list of checkboxes with 'Test' along side.
I've tried this several times and always the same result. I've checked several resource on Google and all have the same kind of syntax for defining and ItemTemplate on a ListBox, so I really cannot see where I'm going wrong.
Code...
<Grid x:Name="LayoutRoot">
<ListBox x:Name="TestList"
SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<CheckBox Content="Check this checkbox!"/>
<TextBlock>Test</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Items>
<ListBoxItem>Bob</ListBoxItem>
<ListBoxItem>Jim</ListBoxItem>
<ListBoxItem>Dave</ListBoxItem>
<ListBoxItem>Larry</ListBoxItem>
<ListBoxItem>Tom</ListBoxItem>
</ListBox.Items>
</ListBox>
</Grid>
Any help greatly appreciated. Sorry for such a dumb-seeming question, but I've really fallen at the first hurdle here :(
AT
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
当您直接将
ListBoxItem
作为项目放置时,ItemTemplate
将不起作用。一般概念是将 CRL 集合数据绑定到ListBox.ItemsSource
,然后指定ItemTemplate
。检查下面的代码。其中
sys
是xmlns:sys="clr-namespace:System; assembly=mscorlib"
这样,就会生成 5 个
ListBoxItems
背景并添加到ListBox
中。ItemTemplate
wont work when you putListBoxItem
directly as items. General concept is you databind a CRL collection to theListBox.ItemsSource
and then specify theItemTemplate
. Check the below code.where
sys
isxmlns:sys="clr-namespace:System;assembly=mscorlib"
In this way, there are 5
ListBoxItems
getting generated in the background and added to theListBox
.如果要将 ListBoxItems 直接添加到 ListBox,则可以使用 ItemContainerStyle 而不是 ItemTemplate。
但是,仅当您需要每个项目级别的独特特征时才建议这样做。
如果您计划让所有项目看起来相同或使用 ItemsSource 创建动态列表,我建议您将字符串(或其他自定义对象)添加到列表中并使用 ItemTemplate 来显示您的项目。 (参见 Jobi Joy 的回答)
这是一个使用 ItemContainerStyle 的示例:
You can use ItemContainerStyle instead of ItemTemplate if you want to add ListBoxItems directly to the ListBox.
Doing so, however, is only recommended when you need unique characteristics on a per item level.
If you are planning on all the items looking the same or making a dynamic list using ItemsSource, I would recommend you add strings (or another custom object) to your list and use ItemTemplate to display your items. (see Jobi Joy's answer)
Here's an example using ItemContainerStyle:
由于某种原因,如果使用 ItemsSource 填充 ListBox,则 DataTemplate 仍然可以被忽略,例如:
请注意,这绑定到包含具有一个属性的对象 (TextAdapter : INotifyPropertyChanged) 的 ObservableCollection: string Text {...}
For some reason DataTemplate can still be ignored if the ListBox is populated using ItemsSource e.g:
Note that this is bound to an ObservableCollection containing objects (TextAdapter : INotifyPropertyChanged) with one property: string Text {...}