2011-06-08 95 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