Как получить SelectedIndex ComboBox, определенный в шаблоне данных? - PullRequest
0 голосов
/ 09 июня 2011

В моем приложении WPF есть функция импорта данных, которая импортирует данные из файла Excel в базу данных.

Чтобы пользователь мог сопоставить столбцы из своего файла Excel со столбцами в моей таблице базы данных, я отображаю список столбцов Excel в ComboBox рядом с именами столбцов таблицы базы данных, позволяя пользователю выбрать соответствующий Excel колонка из ComboBox.

Отображается в 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 с именами столбцов базы данных и начинает импорт, мне нужно иметь возможность получить имя столбца базы данных и соответствующее значение 'ComboBox' SelectedIndex 'для каждого элемента в ListBox, но каждый Элемент в ItemsSource на самом деле является KeyValuePair<ColumnsClass, List<string>>, поэтому я не вижу, как получить значение 'ComboBox' SelectedIndex 'при итерации по коллекции ListBox.Items ...

Есть идеи?

1 Ответ

2 голосов
/ 09 июня 2011

Если вы используете 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 и свяжите с SelectedColumn в вашем XAML:

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

...