WPF - 如何获取DataTemplate中定义的ComboBox的SelectedIndex?

时间:2011-06-08 23:10:26

标签: wpf mvvm datatemplate

在我的WPF应用程序中,我有一个数据导入功能,可以将数据从Excel文件导入数据库。

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

这显示在ListBox中,每个项目都包含ComboBoxTextBlock

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'值...

有什么想法吗?

1 个答案:

答案 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