2015-05-08 62 views
0

假设我有五个文本框和五个旁边的复选框。WPF创建多组控件

现在我想创建x组控件,然后将它与一个对象列表绑定,这些对象将包含来自文本框和文本的文本,如果选中复选框。

这样的事情的常见方法是什么?

我开始编写一个函数,它会循环x次在现有Grid中创建新的RowDefinition,然后在该Row内创建另一个Grid,在该Grid内部创建五行和两列,并添加所有这些控件,行,列,添加绑定等,但我认为这不可能是这样做的正确方法,所有这些都是很麻烦的。一定会有更好的办法。

+0

尝试DataTemplate和ItemsControl。 –

回答

0

您可以使用ItemsControl和为项目定义数据模板来实现此功能。请参阅下面的代码。我以3个文本框和复选框为例。

<StackPanel> 
    <ItemsControl x:Name="itms"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition/> 
         <ColumnDefinition/> 
        </Grid.ColumnDefinitions> 
        <TextBox Width="50" Text="{Binding Text1}" Grid.Row="0" Grid.Column="0"/> 
        <CheckBox IsChecked="{Binding Check1}" Content="Check1" Grid.Row="0" Grid.Column="1"/> 
        <TextBox Width="50" Text="{Binding Text2}" Grid.Row="1" Grid.Column="0"/> 
        <CheckBox IsChecked="{Binding Check2}" Content="Check2" Grid.Row="1" Grid.Column="1"/> 
        <TextBox Width="50" Text="{Binding Text3}" Grid.Row="2" Grid.Column="0"/> 
        <CheckBox IsChecked="{Binding Check3}" Content="Check3" Grid.Row="2" Grid.Column="1"/> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    <Button Click="Button_Click" Content="Add Items"></Button> 
</StackPanel> 

public partial class Window2 : Window 
{ 
    ObservableCollection<MyClass> lst = new ObservableCollection<MyClass>(); 
    public Window2() 
    { 
     InitializeComponent(); 
     itms.ItemsSource = lst; 

    } 
    int i = 0; 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     i++; 
     lst.Add(new MyClass() { Text1 = i.ToString(), Text2 =i.ToString()+1,Text3=i.ToString()+2,Check1=true,Check2=true,Check3=false}); 
    } 
} 

class MyClass 
{ 
    public string Text1 { get; set; } 
    public string Text2 { get; set; } 
    public string Text3 { get; set; } 
    public bool Check1 { get; set; } 
    public bool Check2 { get; set; } 
    public bool Check3 { get; set; } 
}