wpf combobox multibinding到xml文件奇怪的错误

时间:2013-06-30 14:20:11

标签: wpf xml combobox multibinding

我的组合框显示了一个世界国家列表,我遇到了一个奇怪的问题。我使用XML(AllCountries.xml)文件作为我的数据源:

<?xml version="1.0" encoding="utf-8"?>
<countries>
  <country>
    <iso>AF</iso>
    <name>Afghanistan</name>
  </country>
  <country>
    <iso>AL</iso>
    <name>Albania</name>
  </country>
  <country>
    <iso>DZ</iso>
    <name>Algeria</name>
  </country>
  <country>
    <iso>AS</iso>
    <name>American Samoa</name>
  </country>
  <country>
    <iso>AD</iso>
    <name>Andorra</name>
  </country> etc

我的组合框XAML看起来像这样:

<ComboBox 
      Width="200"
      SelectedValuePath="Country"
      ItemsSource="{Binding XPath=/countries/country/name}">
      <ComboBox.DataContext>
         <XmlDataProvider x:Name="Dataxml" Source="\Content\AllCountries.xml" />
      </ComboBox.DataContext>
</ComboBox>

一切都很好:我看到阿富汗,阿尔巴尼亚,Algerie +++。好的,所以我想在下拉列表中显示关联的(iso)代码,如下所示:

阿富汗,AF

阿尔巴尼亚,AL

Algerie,DZ

等等。为此,我将这个ItemTemplate添加到我的组合框:

<ComboBox.ItemTemplate>
     <DataTemplate>
          <TextBlock>
               <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0}, {1}">
                          <Binding XPath="/countries/country/name" />
                          <Binding XPath="/countries/country/iso" />
                    </MultiBinding>
                </TextBlock.Text>
          </TextBlock>
     </DataTemplate>
</ComboBox.ItemTemplate>

运行应用程序时,一切似乎都没问题 - 直到我点击组合框并看到显示以下列表:

阿富汗,AF

阿富汗,AF

阿富汗,AF

阿富汗,AF

阿富汗,AF

阿富汗,AF

阿富汗,AF

阿富汗,AF

阿富汗,AF

阿富汗,AF ....

:-(我的XPath多绑定显然有问题,但我无法弄明白。这里发生了什么???

2 个答案:

答案 0 :(得分:2)

这应该有效

ItemsSource="{Binding XPath=/countries/country}"

<MultiBinding StringFormat="{}{0}, {1}">
    <Binding XPath="name" />
    <Binding XPath="iso" />
</MultiBinding>

因为每个ComboBoxItem的国家/地区都为DataContext

答案 1 :(得分:0)

您也可以尝试设置ItemTemplate以便在内部托管2 TextBlocks并使用路径对每个进行数据绑定!

<ComboBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding XPath="/countries/country/name" }" />
          <TextBlock Text="{Binding XPath="/countries/country/iso" }" />
        </DataTemplate>
      </ComboBox.ItemTemplate> 
</ComboBox>