Хорошо, это - смущающе просто выглядящая проблема, но сводит меня с ума. Я узнаю о DataTemplating и пытаюсь применить очень ОЧЕНЬ простой ItemTemplate к ListBox.
Однако, когда я запускаю свое приложение, шаблон полностью проигнорирован, и я просто получаю стандартно выглядящее поле списка, тогда как на самом деле я ожидал бы видеть список флажков с 'Тестом' вдоль стороны.
Я пробовал это несколько раз и всегда тот же результат. Я проверил несколько ресурсов на Google, и у всех есть тот же вид синтаксиса для определения и ItemTemplate на ListBox, таким образом, я действительно не вижу, где я иду не так, как надо.
Код...
<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>
Любая справка значительно ценится. Извините за такой кажущийся немым образом вопрос, но я действительно упал на первое препятствие здесь :(
В
ItemTemplate
не будет работать, если вы поместите ListBoxItem
непосредственно как элементы. Общая концепция заключается в том, что вы привязываете коллекцию CRL к ListBox.ItemsSource
, а затем указываете ItemTemplate
. Проверьте приведенный ниже код.
<Grid x:Name="LayoutRoot">
<ListBox x:Name="TestList" SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<CheckBox Content="Check this checkbox!"/>
<TextBlock Text="{Binding}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Items>
<sys:String>Bob</sys:String>
<sys:String>Jim</sys:String>
<sys:String>Dave</sys:String>
<sys:String>Larry</sys:String>
<sys:String>Tom</sys:String>
</ListBox.Items>
</ListBox>
</Grid>
где sys
равно xmlns: sys = "clr-namespace: System; assembly = mscorlib"
Таким образом, создается 5 ListBoxItems
в фон и добавлен в ListBox
.
Вы можете использовать ItemContainerStyle вместо ItemTemplate, если хотите добавить ListBoxItems непосредственно в ListBox.
Однако это рекомендуется делать только в том случае, если вам нужны уникальные характеристики на уровне каждого элемента.
Если вы планируете, чтобы все элементы выглядели одинаково или создаете динамический список с помощью ItemsSource, я бы рекомендовал вам добавить строки (или другой пользовательский объект) в список и использовать ItemTemplate для отображения элементов. (см. ответ Jobi Joy)
Вот пример использования ItemContainerStyle:
<ListBox
x:Name="TestList"
SelectionMode="Multiple">
<ListBox.ItemContainerStyle>
<Style
TargetType="ListBoxItem">
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="ListBoxItem">
<StackPanel>
<CheckBox
Content="Check this checkbox!" />
<TextBlock
Text="{TemplateBinding Content}" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.Items>
<ListBoxItem>Bob</ListBoxItem>
<ListBoxItem>Jim</ListBoxItem>
<ListBoxItem>Dave</ListBoxItem>
<ListBoxItem>Larry</ListBoxItem>
<ListBoxItem>Tom</ListBoxItem>
</ListBox.Items>
</ListBox>