假设我旁边有五个文本框和五个复选框。
现在我想要创建x组这样的控件,然后将它与包含文本框中文本的对象列表绑定,如果选中复选框则绑定数据。
这类事情的常用方法是什么?
我开始编写一个函数,它将循环x次在现有Grid中创建新的RowDefinition,然后在该Row内,创建另一个Grid,在Grid内部创建五行和两列,并添加所有这些控件,设置它们的行,列,添加绑定等但我认为这不是正确的方法来做到这一点,这太麻烦写所有这些。必须有更好的方法。
答案 0 :(得分:0)
您可以使用ItemsControl和为项目定义Datatemplate来实现此功能。请参阅以下代码。我举了3个TextBoxes和Checkboxes的例子。
<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; }
}