WPF XML DataBinding - PullRequest
       6

WPF XML DataBinding

0 голосов
/ 30 июня 2009

Я пытаюсь сделать какую-то привязку к данным WPF, но в данный момент я немного зациклен. У меня есть два списка и файл XML. Первый список успешно связывается с источником XML. Тем не менее, когда я пытаюсь привязать дочерний элемент выбранного элемента из первого списка в качестве источника для второго списка, ничего не появляется. Целью является что-то вроде индекса или поиска (выбор одного индекса приводит к поиску связанных элементов). Я что-то здесь упускаю для привязки данных? XAML и XML ниже.

XAML:

<Window x:Class="MyTool.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="600" Width="800">
    <Window.Resources>
        <XmlDataProvider x:Key="AllDeployments" XPath="Deployments" Source="Deployments.xml" />
        <DataTemplate x:Key="dtDeployments">
            <StackPanel FlowDirection="LeftToRight" Orientation="Horizontal">
                <TextBlock Text="{Binding XPath=@Name}" />
                <TextBlock Text=" - "/>
                <TextBlock Text="{Binding XPath=@Date}" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="dtFiles">
            <TextBlock Text="{Binding XPath=File}" />
        </DataTemplate>
    </Window.Resources>
    <Grid Name="gMain">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="2"/>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Menu Grid.Column="0" Grid.ColumnSpan="3"></Menu>
        <ListBox Grid.Column="0" Name="lbDeployment" 
                 ItemsSource="{Binding Source={StaticResource AllDeployments}, XPath=Deployment}"
                 ItemTemplate="{StaticResource dtDeployments}"></ListBox>
        <GridSplitter Grid.Column="1"></GridSplitter>
        <StackPanel Grid.Column="2">
            <ListBox Name="lbFiles" 
                     ItemsSource="{Binding Mode=TwoWay, ElementName=lbDeployments, Path=SelectedItem.InnerText, UpdateSourceTrigger=PropertyChanged}" 
                     ItemTemplate="{StaticResource dtFiles}"
                     Height="400"></ListBox>
        </StackPanel>
    </Grid>
</Window>

XML:

<?xml version="1.0" encoding="utf-8"?>
<Deployments MostRecentDate="12/31/2009 8:41:13 PM">
    <Filters>
        <Filter>.cs</Filter>
        <Filter>.csproj</Filter>
    </Filters>
    <Deployment Name="First Deployment" ID="1" Date="6/29/2009 8:41:13 PM">
        <File>file1.cs</File>
        <File>file2.cs</File>
    </Deployment>
    <Deployment Name="First Deployment" ID="1" Date="6/29/2009 8:41:13 PM">
        <File>file1.cs</File>
        <File>file2.cs</File>
    </Deployment>
    <Deployment Name="First Deployment" ID="1" Date="6/29/2009 8:41:13 PM">
        <File>file1.cs</File>
        <File>file2.cs</File>
    </Deployment>
    <Deployment Name="First Deployment" ID="1" Date="6/29/2009 8:41:13 PM">
        <File>file1.cs</File>
        <File>file2.cs</File>
    </Deployment>
    <Deployment Name="First Deployment" ID="1" Date="6/29/2009 8:41:13 PM">
        <File>file1.cs</File>
        <File>file2.cs</File>
    </Deployment>
</Deployments>

1 Ответ

3 голосов
/ 30 июня 2009

Привязки данных жесткие, потому что они молча терпят неудачу, что делает их очень трудными для отладки. Проблема номер один, которая возникла в вашем коде, - это неправильное написание ElementName в ListBox lbFiles. Ошибки в написании будут вам каждый раз! Мне удалось заставить имена файлов появляться после исправления орфографической ошибки, удаления части привязки innerText и удаления ItemTemplate. Я не уверен, почему ItemTemplate не работал, но, надеюсь, этот пример заставит вас снова двигаться.

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="600" Width="800">
<Window.Resources>
    <XmlDataProvider x:Key="AllDeployments" XPath="Deployments" Source="Deployments.xml" />
    <DataTemplate x:Key="dtDeployments">
        <StackPanel FlowDirection="LeftToRight" Orientation="Horizontal">
            <TextBlock Text="{Binding XPath=@Name}" />
            <TextBlock Text=" - "/>
            <TextBlock Text="{Binding XPath=@Date}" />
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="dtFiles">
        <TextBlock Text="{Binding XPath=File}" />
    </DataTemplate>
</Window.Resources>
<Grid Name="gMain">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="2"/>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Menu Grid.Column="0" Grid.ColumnSpan="3"></Menu>
    <ListBox Grid.Column="0" Name="lbDeployment" 
             ItemsSource="{Binding Source={StaticResource AllDeployments}, XPath=Deployment}"
             ItemTemplate="{StaticResource dtDeployments}"></ListBox>
    <GridSplitter Grid.Column="1"></GridSplitter>
    <StackPanel Grid.Column="2">
        <ListBox Name="lbFiles" 
                 ItemsSource="{Binding ElementName=lbDeployment, Path=SelectedItem, UpdateSourceTrigger=PropertyChanged}"                      
                 Height="400" />
    </StackPanel>
</Grid>

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