在我的WPF应用程序中,我有一个数据导入功能,可以将数据从Excel文件导入数据库。
为了允许用户将Excel文件中的列映射到数据库表中的列,我在数据库表列名称旁边的ComboBox
中显示Excel列的列表,允许用户选择匹配ComboBox
中的Excel列。
这显示在ListBox
中,每个项目都包含ComboBox
和TextBlock
。
ListBox
是数据绑定到Dictionary<ColumnsClass, List<string>>
,其中ColumnsClass
是一个包含数据库列名和其他详细信息的简单对象,List<string>
只是一个列名列表在Excel文件中找到。为了在List<string>
中显示ComboBox
我有一个DataTemplate定义如下:
<DataTemplate x:Key="ColumnList">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="0" ItemsSource="{Binding Value, Mode=OneWay}">
</ComboBox>
<TextBlock Grid.Column="1" Text="{Binding Key, Mode=OneWay}"/>
</Grid>
</DataTemplate>
一旦用户将Excel列映射到数据库列名并开始导入,我需要能够获取ListBox
中每个项目的数据库列名和匹配的“ComboBox”“SelectedIndex”值,但是ItemsSource中的每个项目实际上都是KeyValuePair<ColumnsClass, List<string>>
,因此在迭代ListBox.Items
集合时,我看不到如何获取'ComboBox''SelectedIndex'值...
有什么想法吗?
答案 0 :(得分:2)
如果您使用Dictionary
作为IEnumerable<KeyValuePair<ColumnsClass, List<string>>>
,则可以创建一个自定义类来保存这两个值,并添加一个指定用户选择的值:
class ViewModel
{
public ColumnClass ColumnClass { get; set; }
public List<string> ColumnNames { get; set; }
public string SelectedColumn { get; set; }
}
然后使用List<ViewModel>
(或任何其他集合)代替您的Dictionary
并绑定到您的XAML中的SelectedColumn
:
<DataTemplate x:Key="ColumnList">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="0" ItemsSource="{Binding ColumnNames, Mode=OneWay}"
SelectedItem="{Binding SelectedColumn}" />
<TextBlock Grid.Column="1" Text="{Binding ColumnClass, Mode=OneWay}"/>
</Grid>
</DataTemplate>
如果出于某种原因,您不想创建单独的课程并且使用.Net 4,则可以使用Tuple<ColumnClass, List<string>, string>
代替ViewModel
。