2016-04-12 10 views
1

Ich verwende WPF. Ich habe ObservableCollection von ToggleButton:Wie bindet man eine ObservableCollection <T> an ein WrapPanel?

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

und ich möchte diese ObservableCollection Kontrollen (ToggleButtons) als WrapPanel Kinder binden. Jedes Mal, wenn ich myg.Add(new ToggleButton) benutze, möchte ich, dass die Steuerung WrapPanel automatisch hinzugefügt wird.

Beispiel XAML:

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

Ist es möglich, wenn ja - wie? Vielleicht gibt es andere ähnliche Möglichkeiten, das zu tun?

+0

Es ist möglich - Werfen Sie einen Blick auf diese: http://StackOverflow.com/Questions/16366732/How-to-dynamic-add-controls-to-a-wrappanel-in-another-class –

+0

Sieht richtig aus wie Ich will. Aber für jetzt schwer zu verstehen, habe ich wenig Erfahrung :). – armandasalmd

+0

Vielleicht gibt es mehr Wege? – armandasalmd

Antwort

4

Es ist sehr einfach, aber es gibt einen kleinen Haken:

Um den ‚beobachtbar Sammlung‘ -Funktion zu nutzen, muss man sich binden, aber es gibt keine Eigenschaft wie ItemsSource auf WrapPanel.

Lösung:

Verwenden Sie ein ItemsControl und stellen Sie die Platte ein WrapPanel zu sein, die Elemente beherbergt.

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> 

-Code

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); 
     } 
    } 
} 

Hinweis:

Zuordnung Ihrer Sammlung der DataContext entlastet Sie direkt mit Ihrem WrapPanel beschäftigen , die <ItemsControl Grid.Row="1" ItemsSource="{Binding}"> bindet standardmäßig an diese Eigenschaft.

+0

Einfache und verständliche Art und Weise und es funktioniert. Gut gemacht :) – armandasalmd