【问题标题】:How can I bind parent/child ComboBox's against XML datasource?如何将父/子 ComboBox 绑定到 XML 数据源?
【发布时间】:2010-04-14 06:05:44
【问题描述】:

我有以下 XML(简化示例),它应该在两个 ComboBox 之间具有父/子关系。父级绑定正确但子级没有绑定到父级SelectedItem

当我针对 foobar XML 设置 xmlns 并删除所有命名空间引用时,它按预期工作。此外,如果我将ItemsSource="{Binding XPath=fb:foo/fb:bars/fb:bar}"comboBar 相对设置,它会从两个foo 元素中找到所有bar 节点。

示例(经测试可在 XamlPad 中工作)

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <Page.Resources>
    <XmlDataProvider x:Key="foobarSource" XPath="fb:foobar">
      <XmlDataProvider.XmlNamespaceManager>
        <XmlNamespaceMappingCollection>
          <XmlNamespaceMapping
            Prefix="fb" Uri="http://foo.bar/1.0/foobar.xsd"/>
        </XmlNamespaceMappingCollection>
      </XmlDataProvider.XmlNamespaceManager>
      <x:XData>
        <foobar xmlns="http://foo.bar/1.0/foobar.xsd">
          <foo name="Foo 1">
            <bars name='bars 1'>
              <bar name="first"/>
              <bar name="second"/>
            </bars>
          </foo>
          <foo name="Foo 2">
            <bars name='bars 2'>
              <bar name="third"/>
              <bar name="fourth"/>
            </bars>
          </foo>
        </foobar>
      </x:XData>
    </XmlDataProvider>
    <DataTemplate x:Key="comboTemplate">
      <TextBlock Text="{Binding XPath=@name}" />
    </DataTemplate>
  </Page.Resources>

  <StackPanel DataContext="{StaticResource foobarSource}">
    <ComboBox Width="150" x:Name="comboFoo"
              IsSynchronizedWithCurrentItem="True"
              ItemsSource="{Binding XPath=fb:foo}"
              ItemTemplate="{StaticResource comboTemplate}"/>
    <ComboBox Width="150" x:Name="comboBar"
              IsSynchronizedWithCurrentItem="True"
              DataContext="{Binding SelectedItem, ElementName=comboFoo}"
              ItemsSource="{Binding XPath=fb:bars/fb:bar}"
              ItemTemplate="{StaticResource comboTemplate}"/>
  </StackPanel>
</Page>

【问题讨论】:

    标签: wpf xml data-binding xaml xpath


    【解决方案1】:

    如果您使用 Visual Studio 而不是 XamlPad,您会看到您收到 XPathException,说明需要命名空间管理器或 XsltContext。

    <Window.Resources>
    
        <XmlNamespaceMappingCollection x:Key="fbNamespaces">
            <XmlNamespaceMapping Prefix="fb" Uri="http://foo.bar/1.0/foobar.xsd" />
        </XmlNamespaceMappingCollection>
    
        <XmlDataProvider x:Key="foobarSource" XPath="fb:foobar">
            <XmlDataProvider.XmlNamespaceManager>
                <XmlNamespaceMappingCollection>
                    <XmlNamespaceMapping Prefix="fb" Uri="http://foo.bar/1.0/foobar.xsd" />
                </XmlNamespaceMappingCollection>
            </XmlDataProvider.XmlNamespaceManager>
            <x:XData>
                <foobar xmlns="http://foo.bar/1.0/foobar.xsd">
                    <foo name="Foo 1">
                        <bars name='bars 1'>
                            <bar name="first" />
                            <bar name="second" />
                        </bars>
                    </foo>
                    <foo name="Foo 2">
                        <bars name='bars 2'>
                            <bar name="third" />
                            <bar name="fourth" />
                        </bars>
                    </foo>
                </foobar>
            </x:XData>
        </XmlDataProvider>
    
        <DataTemplate x:Key="comboTemplate">
            <TextBlock Text="{Binding XPath=@name}" />
        </DataTemplate>
    
    </Window.Resources>
    
    <StackPanel 
        Binding.XmlNamespaceManager="{StaticResource fbNamespaces}">
    
        <ComboBox Width="150" x:Name="comboFoo" 
              IsSynchronizedWithCurrentItem="True" 
              DataContext="{StaticResource foobarSource}"    
              ItemsSource="{Binding XPath=fb:foo}" 
              ItemTemplate="{StaticResource comboTemplate}" />
        <ComboBox Width="150" 
              IsSynchronizedWithCurrentItem="True" 
              DataContext="{Binding SelectedItem, ElementName=comboFoo}" 
              ItemsSource="{Binding XPath=fb:bars/fb:bar}" 
              ItemTemplate="{StaticResource comboTemplate}" />
    
    </StackPanel>
    

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 2011-03-07
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 2013-10-21
      • 2013-03-16
      • 1970-01-01
      相关资源
      最近更新 更多