wpf组合框数据绑定xml

时间:2012-12-26 10:55:10

标签: c# wpf binding combobox

我想将所有组名(contact_grname)显示在我的组合框中,但只显示一个项目! 那是为什么?!

<XmlDataProvider x:Key="TeleData" XPath="/response/contacts/contact">

</XmlDataProvider>

<CollectionViewSource x:Key="TeleView"  Source="{StaticResource TeleData}" >
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="contact_name" Direction="Ascending" />

    </CollectionViewSource.SortDescriptions>

    <CollectionViewSource.GroupDescriptions>
        <dat:PropertyGroupDescription PropertyName="contact_grname" />

    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

<ComboBox ItemsSource="{Binding Source={StaticResource TeleView}, XPath=contact_grname}" />

我的xml文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<response>
    <contacts>
        <contact>
            <contact_grname>group1</contact_grname>
            <contact_name>Bart</contact_name>
        </contact>
        <contact>
            <contact_grname>group1</contact_grname>
            <contact_name>Eric</contact_name>
        </contact>
        <contact>
            <contact_grname>group2</contact_grname>
            <contact_name>Mike</contact_name>
        </contact>
    </contacts>
</response>

只有group1出现(一次)。 当我在组合框中使用StaticResource TeleData而不是TeleView时,则会显示所有组名(但是有两个值,因为没有按这种方式分组)

组合框中的预期输出:

  • 组1
  • 组2

现在我(使用TeleView):

  • 组1

如果我使用Teledata:

  • 组1
  • 组1
  • 组2

2 个答案:

答案 0 :(得分:0)

这不是你问题的答案,但它可能有所帮助。考虑一下这个ComboBox:

<ComboBox SelectedIndex="1">
        <ComboBox.Resources>
            <XmlDataProvider x:Key="Data"
                             XPath="response/contacts">
                <x:XData>
                        <response>
                            <contacts>
                                <contact>
                                    <contact_grname>group1</contact_grname>
                                    <contact_name>Bart</contact_name>
                                    <contact_name>Eric</contact_name>
                                </contact>
                                <contact>
                                    <contact_grname>group2</contact_grname>
                                    <contact_name>Mike</contact_name>
                                </contact>
                            </contacts>
                        </response>
                </x:XData>
            </XmlDataProvider>
        </ComboBox.Resources>
        <ComboBox.ItemsSource>
            <Binding Source="{StaticResource Data}"
                     XPath="contact/contact_name"  />
        </ComboBox.ItemsSource>
    </ComboBox>

显示“Bart”,“Eric”和“Mike”。有了这个绑定:

<Binding Source="{StaticResource Data}"
                     XPath="contact/contact_grname"  />

您将获得“group1”,“group2”。但这是因为我改变了xml。使用你的xlm,我的意思是:

 <contact>
    <contact_grname>group1</contact_grname>
    <contact_name>Bart</contact_name>
 </contact> 
 <contact>
    <contact_grname>group1</contact_grname>
    <contact_name>Mike</contact_name>
 </contact> 

结果是“group1”,“group1”和“group2”。

因此,一个建议是从这行代码中删除/contact

<XmlDataProvider x:Key="TeleData" XPath="/response/contacts/contact">

答案 1 :(得分:0)

如果您只想显示Groups,您可以通过CollectionViewSource.View.Groups路径

实际访问ItemSource媒体资源
<ComboBox ItemsSource="{Binding Source={StaticResource TeleView}, Path=Groups}" SelectedValuePath="Name" />

输出:

  • group1
  • 组2