Привязка ListBox к XmlDataProvider
Может кто-нибудь сказать, почему это не работает. Это действительно просто, но 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 ответ
Вам нужно установить 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>