2015-01-17 4 views
0

После загрузки данных из базы данных (скажем, загруженных курсов) я хочу показать их в списке. Я читал, что вы можете добавлять динамический контент, используя UserControl, но примеры специально предназначены для динамического изменения контента, а не для представления списка результатов.Программно добавление представлений/элементов управления в WPF

То, что я хочу, чтобы создать XAML шаблон и создать его экземпляр раз в элементе списка, и добавить его в список (другими словами, добавив его в StackedPanel). Как я могу это достичь? Кроме того, следует ли использовать Page или UserControl?

+0

http://stackoverflow.com/questions/11095189/adding-controls-dynamically-in-wpf-mvvm/11095460#11095460 – blindmeis

+0

Почему бы не использовать шаблон списка и элемента? –

ответ

2

Это именно то, что было ListBox и ItemsControl элементы управления созданы. ListBox - это расширенная версия ItemsControl, поэтому я буду говорить только о последнем, базовом.

ItemsControl содержит свойство зависимости, называемое ItemsSource. Пропустите коллекцию там, и ItemsControl создаст «панель», заполненную «представлениями» элементов, взятых из этого источника.

По умолчанию ItemsControl использует панель StackPanel в качестве панели, но вы можете изменить ее, если хотите, с помощью свойства ItemPanel.

По умолчанию ItemsControl использует шаблон WPF по умолчанию для создания и представления представления для каждого элемента. Однако вы можете использовать свойство ItemTemplate, чтобы установить DataTemplate, который расскажет, как должно выглядеть представление.

Пример:

<!-- simple vertical/StackPanel list --> 
<ItemsControl ItemsSource="{Binding MyItems}"> 
    <ItemsControl.ItemTemplate> 
     <!-- the template of a single Item --> 
     <!-- note that I'm setting it here explicitely --> 
     <!-- but the ItemTemplate prop could have been bound, resourcized, etc --> 
     <DataTemplate> 
      <Border BorderThickness="1"> 
       <!-- reads a ShoeSize from the items from MyItems --> 
       <TextBlock Text="{Binding ShoeSize}" /> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

<!-- simple horizontal/StackPanel list --> 
<ItemsControl ItemsSource="{Binding MyItems}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Border BorderThickness="1"> 
       <TextBlock Text="{Binding ShoeSize}" /> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 


<!-- you can use any panel and any itemtemplate --> 
<ItemsControl ItemsSource="{Binding MyXYPoints}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <!-- any Panel is OK! even plain canvas --> 
      <Canvas /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <!-- just remember that in canvas there's no autolayout --> 
      <!-- so you need to set the coords on each item! --> 
      <Ellipse Width="2" Height="2" 
        Canvas.Left="{Binding PositionX}" 
        Canvas.Top="{Binding PositionY}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

ListBox, по существу, тот же контроль, но предоставляет вам некоторые лакомства «по умолчанию» как возможность прокрутки (виртуализация) элементов, если их слишком много, выбрать элемент, и так далее. Вы можете получить эти функции из ItemsControl, но вам нужно будет реализовать или, по крайней мере, настроить их самостоятельно. ListBox уже сделал это. Но определенно «тяжелее», чем ItemsControl, поэтому выбирайте то, что подходит лучше всего.

Anyways .. Я написал это только потому, что сегодня был в таком настроении. Но вам действительно нужно больше узнать о ItemsControl и Bindings. В WPF вы почти никогда не размещаете вещи в пользовательском интерфейсе «вручную из кода». Я на самом деле не должен писать столько, потому что эксперты уже покрывали все это. Просьба прочитатьthis excellent series of articles by Dr.Wpf. Особенно в главе «Я», поскольку она касается именно того, о чем вы просили, но я действительно рекомендую прочитать их все. Они несколько детализированы, немного для некоторых читателей, но вам очень нужен обзор того, какие отличные инструменты у вас под рукой.

+0

спасибо, это именно то, что мне нужно, чтобы понять, как работает MVVM. Я до сих пор не понимал полного разделения слоев. –

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