Привязка ListBox к XmlDataProvider - PullRequest
1 голос
/ 03 декабря 2011

Может кто-нибудь сказать, почему это не работает.Это действительно просто, но ListBox пуст при запуске.Код содержит только InitializeComponent () и ничего больше.

Надеюсь, у кого-то есть идея ...

<Window x:Class="DasDataGrid.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow" Height="350" Width="700">

    <Window.Resources>
        <XmlDataProvider x:Key="Maschinen" XPath="/machines">
            <x:XData>
                <machines>
                    <machine name="alte Maschine"/>
                    <machine name="neue Maschine"/>
                </machines>
            </x:XData>
        </XmlDataProvider>
    </Window.Resources>
    <ListBox ItemsSource="{Binding Source={StaticResource Maschinen},XPath=machine/@name}"
              IsSynchronizedWithCurrentItem="True"
              SelectedIndex="1">
    </ListBox>
</Window>

@ HB Вот код, который я тестировал.При запуске ListBox все еще пуст.Я не знаю, что случилось.

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <StackPanel.Resources>
        <XmlDataProvider x:Key="Maschinen">
        <x:XData>
            <machines xmlns="">
                <machine name="alte Maschine"/>
                <machine name="neue Maschine"/>
            </machines>
        </x:XData>
        </XmlDataProvider>
    </StackPanel.Resources>

    <ListBox ItemsSource="{Binding Source={StaticResource Maschinen}, XPath=machine}"
      IsSynchronizedWithCurrentItem="True" DisplayMemberPath="@name"
      SelectedIndex="1">
    </ListBox>

</StackPanel>
</Window>    

1 Ответ

0 голосов
/ 03 декабря 2011

Вам нужно установить xmlns в пустую строку:

<x:XData>
    <machines xmlns="">
        <machine name="alte Maschine"/>
        <machine name="neue Maschine"/>
    </machines>
</x:XData>

MSDN

Корневой узел данных XML имеет атрибут xmlns, который задает для пространства имен XML пустую строку. Это требование для применения запросов XPath к острову данных, встроенному в страницу XAML. В этом встроенном случае XAML и, следовательно, остров данных наследуют пространство имен System.Windows. Из-за этого вам нужно установить пустое пространство имен, чтобы не допустить, чтобы запросы XPath были квалифицированы пространством имен System.Windows, что могло бы перенаправить запросы.


И вы, возможно, захотите связать таким образом (даже если это не имеет значения с точки зрения результатов):

<ListBox ItemsSource="{Binding Source={StaticResource Maschinen}, XPath=machine}"
          IsSynchronizedWithCurrentItem="True" DisplayMemberPath="@name"
          SelectedIndex="1">
</ListBox>
...