2016-04-12 1 views
1

Я использую WPF. У меня есть ObservableCollection из ToggleButton:Как связать ObservableCollection <T> с WrapPanel?

private ObservableCollection<ToggleButton> myg = new ObservableCollection<ToggleButton>(); 

, и я хочу, чтобы связать эти ObservableCollection управления (ToggleButtons) в качестве WrapPanel детей. Каждый раз, когда я использую myg.Add(new ToggleButton), я хочу, чтобы он автоматически добавлял управление в WrapPanel.

Пример XAML:

<WrapPanel Name="test1"> 
    <!-- I want to bind (add) these controls here --> 
</WrapPanel> 

Можно ли, если да - то как? Может быть, есть и другой подобный способ сделать это?

+0

Возможно - взгляните на это: http://stackoverflow.com/questions/16366732/how-to-dynamically-add-controls-to-a-wrappanel-in-another-class –

+0

Выглядит правильно, как Я хочу. Но пока трудно понять, у меня низкий опыт :). – armandasalmd

+0

Возможно, есть еще несколько способов? – armandasalmd

ответ

4

Это очень легко, но есть небольшой улов:

Чтобы использовать функцию «наблюдаемая коллекция», нужно привязать к нему, но нет никакой собственности, такой как ItemsSource на WrapPanel.

Решение:

Используйте ItemsControl и установите панель, чтобы быть WrapPanel, что принимает элементы.

XAML

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfApplication1" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     Title="MainWindow" 
     Width="525" 
     Height="350" 
     mc:Ignorable="d"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="1*" /> 
     </Grid.RowDefinitions> 
     <Button Grid.Row="0" 
       Click="Button_Click" 
       Content="Add toggle" /> 
     <ItemsControl Grid.Row="1" ItemsSource="{Binding}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <WrapPanel IsItemsHost="True" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </Grid> 
</Window> 

Код

using System.Collections.ObjectModel; 
using System.Windows; 
using System.Windows.Controls.Primitives; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 
     private readonly ObservableCollection<ToggleButton> _collection; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      _collection = new ObservableCollection<ToggleButton>(); 

      DataContext = _collection; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      var toggleButton = new ToggleButton 
      { 
       Content = "Toggle" + _collection.Count 
      }; 
      _collection.Add(toggleButton); 
     } 
    } 
} 

Примечание:

Назначение коллекции в DataContext избавляет вас дело непосредственно с вашим WrapPanel , <ItemsControl Grid.Row="1" ItemsSource="{Binding}"> привязывается к этому свойству по умолчанию.

+0

Легкий и понятный способ, и он работает. Отличная работа :) – armandasalmd

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