WPF - Очень простой вопрос ListBox.ItemTemplate - PullRequest
14 голосов
/ 16 марта 2010

Хорошо, это очень простая проблема, но она сводит меня с ума. Я изучаю 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>

Любая помощь с благодарностью. Извините за такой глупый вопрос, но я действительно упал на первое препятствие здесь: (

AT

Ответы [ 3 ]

19 голосов
/ 16 марта 2010

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.

7 голосов
/ 16 марта 2010

Вы можете использовать ItemContainerStyle вместо ItemTemplate, если хотите добавить ListBoxItems непосредственно в ListBox.

Однако делать это рекомендуется только тогда, когда вам нужны уникальные характеристики на уровне предмета.

Если вы планируете, чтобы все элементы выглядели одинаково или создавали динамический список с использованием ItemsSource, я бы порекомендовал вам добавить строки (или другой пользовательский объект) в ваш список и использовать ItemTemplate для отображения ваших элементов. (см. ответ Джоби Джой)

Вот пример использования 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>
0 голосов
/ 29 августа 2013

По какой-то причине DataTemplate все еще можно игнорировать, если ListBox заполнен с использованием ItemsSource, например:

    <ListBox Name="Test" x:FieldModifier="public" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Обратите внимание, что это связано с ObservableCollection, содержащим объекты (TextAdapter: INotifyPropertyChanged) с одним свойством: string Text {...}

...