Как я могу связать родительский / дочерний ComboBox с источником данных XML? - PullRequest
1 голос
/ 15 декабря 2009

У меня есть следующий XML (упрощенный пример), который должен иметь отношения родитель / потомок между двумя ComboBox. Родитель связывает правильно, но ребенок не связывает с родителями SelectedItem.

Когда я устанавливаю xmlns против foobar XML и удаляю все ссылки на пространства имен, он работает как положено. Также, если я установлю ItemsSource="{Binding XPath=fb:foo/fb:bars/fb:bar}" против comboBar, он найдет все узлы bar, как и ожидалось от обоих foo элементов.

ПРИМЕР (протестирован для работы в 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>

1 Ответ

1 голос
/ 14 апреля 2010

Если бы вы использовали Visual Studio вместо XamlPad, вы бы увидели, что вы получаете XPathException с указанием Namespace Manager или 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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...