2011-06-08 93 views
0

在我的WPF应用程序中,我有一个数据导入功能,可将数据从Excel文件导入到数据库中。WPF - 如何获取在DataTemplate中定义的ComboBox的SelectedIndex?

为了允许用户将列从他们的Excel文件映射到我的数据库表中的列,我在数据库表列名旁边的ComboBox中显示Excel列的列表,允许用户选择匹配的Excel列从ComboBox

这与含有ComboBoxTextBlock每个项目显示在一个ListBox

ListBox是数据绑定到一个Dictionary<ColumnsClass, List<string>>其中ColumnsClass是包含数据库列名称和其他细节的简单对象和List<string>只是一个Excel文件中列名的列表。为了显示在ComboBoxList<string>我有一个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

请注意,在这种情况下,您不必指定'ColumnDefinition'的宽度,因为'1 *'是默认值。 – svick 2011-06-08 23:34:40

+0

对,这是已修改的代码,定义了更多的列,并且'1 *'不是实际代码中的值... – 2011-06-08 23:43:03

回答

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>(或任何其他集合),而不是你在你的XAML Dictionary并绑定到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

+0

看起来像一个好的解决方案,明天就会给它一个镜头,让你知道它是否工作...谢谢。 – 2011-06-08 23:44:22

+0

只是脑筋痉挛日子试图解决什么是错误的方法摆在首位。谢谢。 – 2011-06-09 16:45:30