2009-06-30 8 views
0

J'essaye de faire une liaison de données WPF, mais je suis un peu raccroché pour le moment. J'ai deux listboxes et un fichier XML. La première zone de liste se lie à la source XML. Toutefois, lorsque j'essaie de lier à un enfant de l'élément sélectionné de la première zone de liste comme source pour la deuxième zone de liste, rien n'apparaît. L'objectif étant quelque chose comme un index ou une recherche (la sélection d'un index entraîne la recherche des éléments associés). Est-ce que je manque quelque chose ici pour la liaison de données? XAML et XML ci-dessous.WPF XML DataBinding

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 [email protected]}" /> 
       <TextBlock Text=" - "/> 
       <TextBlock Text="{Binding [email protected]}" /> 
      </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> 

Répondre

3

Les liaisons de données sont difficiles, car ils ont tendance à échouer en silence, ce qui les rend très difficiles à déboguer. Le numéro un problème que vous avez eu dans votre code était une faute d'orthographe de l'ElementName sur le ListBox lbFiles. Les fautes d'orthographe vous obtiendront à chaque fois! J'ai été en mesure d'obtenir les noms de fichiers à apparaître après avoir corrigé l'erreur d'orthographe, en supprimant la partie innerText de la liaison et en supprimant le ItemTemplate. Je ne sais pas pourquoi le ItemTemplate ne fonctionnait pas, mais j'espère que cet exemple vous fera bouger à nouveau.

<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 [email protected]}" /> 
      <TextBlock Text=" - "/> 
      <TextBlock Text="{Binding [email protected]}" /> 
     </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> 

+0

Merci de remarquer la faute d'orthographe. En ce qui concerne le modèle ne fonctionne pas, je me méfie qu'il a quelque chose à voir avec le XPath fourni en elle. – CodeMonkey1313