2010-03-16 4 views
13

Хорошо, это довольно смущающая проблема, но сводит меня с ума. Я изучаю DataTemplating и пытаюсь применить очень ОЧЕНЬ простой ItemTemplate в ListBox.WPF - очень простой ListBox.ItemTemplate Вопрос

Однако, когда я запускаю свое приложение, шаблон полностью игнорируется, и я просто получаю стандартный список, тогда как на самом деле я ожидаю увидеть список флажков с тестом «рядом».

Я пробовал это несколько раз и всегда был одним и тем же результатом. Я проверил несколько ресурсов в 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

ответ

17

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-имен: System; сборка = mscorlib"..

Таким образом, существует 5 Списков ListBoxItems, генерируемых в e background и добавлен в ListBox.

7

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

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

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

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

почему 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 {...}

Смежные вопросы