列表框与组合框DataTemplate绑定
问题描述:
我目前有一个Combobox
在Datatemplate
为Listbox
。我已将Combobox
限制为string[]
。这工作正常。列表框与组合框DataTemplate绑定
我想要的是当Combobox
改变时,Listbox
的索引应该与数组中的字符串相关联。 也就是说如果我在Listbox
的第三行中选择Combobox
中的第4项,我的数据应该用<字符串(Combobox
字符串),int(Listbox
索引)>表示,但为了保存重复数据,我希望将此数据用作我的Combobox
绑定。
我在想我可以使用一个键值对,但我不确定如何将它绑定到Combobox
那是DataTemplate
(或者如果这是这样做的最好方法)。
注意
显然,这意味着每个Combobox
串只能一次一个Listbox
指数相关联。 因此,我想如果每个Combobox
串只能在Listbox
设置一次,即,如果我在Listbox
然后Listbox
索引5,它已经有Combobox
3应当被重置为空的索引4选择Combobox
索引3。如果对于相同的字符串,我可能会在Combobox
更改的事件中通过并重置另一个Comboboxes
。
样品
OK所以下面绑定工作;
<Window.Resources>
<DataTemplate x:Key="lbxHeaderDataTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Content="{Binding Item1}"></Label>
<ComboBox Name="cbxTest" Grid.Column="1" ItemsSource="{Binding
Item2}" DisplayMemberPath="Key"></ComboBox>
</Grid>
</DataTemplate>
</Window.Resources>
<StackPanel Width="auto" Height="auto">
<ListBox Name="lbxFields"
ItemTemplate="{DynamicResource lbxHeaderDataTemplate}"
HorizontalContentAlignment="Stretch">
</ListBox>
</StackPanel>
C#
private List<KeyValuePair<string, int>> cbxOptions2 = new List<KeyValuePair<string, int>>();
cbxOptions2.Add(new KeyValuePair<string, int>("", 0));
cbxOptions2.Add(new KeyValuePair<string, int>("Identifier", 0));
cbxOptions2.Add(new KeyValuePair<string, int>("Family Identifier", 0));
cbxOptions2.Add(new KeyValuePair<string, int>("File Path", 0));
for (int i = 0; i < 10; i++)
{
lbxDatFields.Items.Add(new Tuple<string, List<KeyValuePair<string, int>>>((i * 10).ToString(), cbxOptions2));
}
答
这正是我最终使用。请随时提出更好的答案。
<Window.Resources>
<DataTemplate x:Key="lbxHeaderDataTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Content="{Binding Item1}"></Label>
<ComboBox Name="cbxTest" Grid.Column="1" ItemsSource="{Binding
Item2}" DisplayMemberPath="Key"
SelectionChanged="cbxTest_SelectionChanged"></ComboBox>
</Grid>
</DataTemplate>
</Window.Resources>
<StackPanel Width="auto" Height="auto">
<ListBox Name="lbxFields"
ItemTemplate="{DynamicResource lbxHeaderDataTemplate}"
HorizontalContentAlignment="Stretch">
</ListBox>
</StackPanel>
C#
private Dictionary<string, int> cbxOptions2 = new Dictionary<string, int>();
cbxOptions2.Add("", 0);
cbxOptions2.Add("Identifier", 0);
cbxOptions2.Add("Family Identifier", 0);
cbxOptions2.Add("File Path", 0);
for (int i = 0; i < 10; i++)
{
lbxDatFields.Items.Add(new Tuple<string, Dictionary<string, int>>((i * 10).ToString(), cbxOptions2));
}
private void cbxTest_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox test = (ComboBox)sender;
DependencyObject parent = VisualTreeHelper.GetParent(test);
Label currentTxt = null;
foreach (object o in ((Grid)parent).Children)
{
if (o is Label)
{
currentTxt = (Label)o;
}
}
}