Я пытаюсь изменить привязку данных XML динамически на основе выбора.

Окно списка связывается с названием фильма и в зависимости от выбора названия фильма мне нужны соответствующие имена исполнителей в сетке данных.

Пример - если мы выберем Movie1, мне нужно отобразить Artist 1, Artis 2 и Artist 3

Пожалуйста, помогите мне, как я могу достичь вышеуказанного решения. Ниже я попробовал.

Ниже мой xml

<Movies>
  <Movie Name = "Movie 1">
    <Artist Name="Artist 1"/>
    <Artist Name="Artist 2"/>
    <Artist Name="Artist 3"/>
  </Movie>
  <Movie Name = "Movie 2">
    <Artist Name="Artist 11"/>
    <Artist Name="Artist 22"/>
    <Artist Name="Artist 33"/>
  </Movie>
</Movies>

Ниже мой Xaml

<ListBox 
    Grid.Column="0" 
    Width="100" 
    DataContext="{StaticResource MovieData}" 
    ItemsSource="{Binding XPath=/Movies/Movie/@Name}"
    />

<DataGrid 
    Grid.Column="1" 
    Width="200" 
    x:Name="dgridEmp" 
    DataContext="{StaticResource MovieData}" 
    ItemsSource="{Binding XPath=/Movies/Movie/Artist}"
    AutoGenerateColumns="False"
    >
    <DataGrid.Columns>
        <DataGridTextColumn 
            Header="Name" 
            Binding="{Binding XPath=@Name}" 
            />
    </DataGrid.Columns>
</DataGrid>
-1
superuser 28 Май 2017 в 20:14

2 ответа

Лучший ответ

Это работает для меня. Я несколько изменил привязки в ListBox: теперь ListBox содержит список элементов Movie, но отображает только @Name каждого из них.

DataGrid использует выбранный элемент Movie из ListBox в качестве своего DataContext, а затем использует XPath для извлечения всех элементов Artist из этого выбранного Movie.

<ListBox 
    Width="100" 
    x:Name="MovieSelector"
    ItemsSource="{Binding Source={StaticResource MovieData}, XPath=Movies/Movie}"
    HorizontalAlignment="Left"
    DisplayMemberPath="@Name"
    />

<DataGrid 
    Grid.Column="1" 
    Width="200" 
    x:Name="dgridEmp" 
    DataContext="{Binding SelectedItem, ElementName=MovieSelector}"
    ItemsSource="{Binding XPath=Artist}"
    AutoGenerateColumns="False"
    HorizontalAlignment="Left"
    >
    <DataGrid.Columns>
        <DataGridTextColumn 
            Header="Name" 
            Binding="{Binding XPath=@Name}" 
            />
    </DataGrid.Columns>
</DataGrid>

Вот XmlDataProvider, который я использовал:

<XmlDataProvider
    x:Key="MovieData"
    >
    <x:XData>
        <Movies xmlns="">
            <Movie Name="Movie 1">
                <Artist Name="Artist 1"/>
                <Artist Name="Artist 2"/>
                <Artist Name="Artist 3"/>
            </Movie>
            <Movie Name="Movie 2">
                <Artist Name="Artist 11"/>
                <Artist Name="Artist 22"/>
                <Artist Name="Artist 33"/>
                <Sleestak Name="Sleestak 44"/>
            </Movie>
        </Movies>
    </x:XData>
</XmlDataProvider>
1
15ee8f99-57ff-4f92-890c-b56153 28 Май 2017 в 17:58

Чтобы показать художников, вам нужно связать DataGrid с SelectedItem из ListBox. Что-то вроде этого базового примера должно сработать:

<ListBox x:Name="ListBox_Movies"
         DataContext="{StaticResource MovieData}"
         ItemsSource="{Binding XPath=/Movies/Movie/@Name}"/>
<DataGrid ItemsSource="{Binding ElementName=ListBox_Movies, Path=SelectedItem}"/>
-1
Fruchtzwerg 28 Май 2017 в 17:29