2016-04-12 37 views
1

WPF kullanıyorum. Ben ToggleButton ait ObservableCollection var:Bir GözlemKontrolü <T> bir WrapPanel'e nasıl bağlanır?

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

ve ben WrapPanel çocuk olarak bu ObservableCollection kontrolleri (ToggleButtons) bağlamak istiyorum. Her zaman myg.Add(new ToggleButton) kullanıyorum Otomatik olarak WrapPanel kontrolünü eklemek istiyorum.

Örnek XAML: - nasıl

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

evet ise, mümkün mü? Belki de bunu yapmanın başka bir yolu var mı?

+0

Mümkün - Şuna bir bakın: http://stackoverflow.com/questions/16366732/how-to-dynamically-add-controls-to-a-wrappanel-in-another-class –

+0

Doğru nasıl görünüyor İstiyorum. Ama şimdi anlamak zor, ben düşük deneyimim var :). – armandasalmd

+0

Belki başka yollar var mı? – armandasalmd

cevap

4

Bu çok kolay ama biraz sorun var:

'gözlemlenebilir koleksiyonu' özelliğini kaldıraç için, bir ona bağlamak gerekiyor ancak WrapPanel üzerinde ItemsSource gibi hiçbir özellik yoktur.

Çözüm:

kullanın bir ItemsControl ve öğeleri barındıran bir WrapPanel olma panelini ayarlayın.

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> 

Kod

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

Not: DataContext koleksiyonunuzu Atama

doğrudan WrapPanel başa hafifletir <ItemsControl Grid.Row="1" ItemsSource="{Binding}">, bu özelliğe varsayılan olarak bağlanır.

+0

Kolay ve anlaşılır bir şekilde çalışır. Aferin :) – armandasalmd