2009-06-30 8 views
0

Ich versuche, einige WPF Databinding zu tun, aber ich bin im Moment ein wenig aufgelegt. Ich habe zwei Listboxen und eine XML-Datei. Die erste Listbox bindet erfolgreich an die XML-Quelle. Wenn ich jedoch versuche, an ein untergeordnetes Element des ausgewählten Elements aus der ersten Listbox als Quelle für das zweite Listenfeld zu binden, wird nichts angezeigt. Das Ziel ist etwa ein Index oder eine Suche (die Auswahl eines Indexes führt dazu, dass die zugehörigen Elemente gefunden werden). Fehle ich hier etwas für die Datenbindung? XAML und XML unten.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> 

Antwort

3

Datenbindungen sind hart, weil sie still scheitern neigen, wodurch sie sehr schwer zu debuggen macht. Das größte Problem, das Sie in Ihrem Code hatten, war eine falsche Schreibweise des ElementName in der lbFiles ListBox. Rechtschreibfehler bekommen Sie jedes Mal! Ich konnte die Dateinamen nach dem Korrigieren des Rechtschreibfehlers, dem Entfernen des InnerText-Abschnitts der Bindung und dem Entfernen der ItemTemplate anzeigen lassen. Ich bin mir nicht sicher, warum das ItemTemplate nicht funktionierte, aber hoffentlich bringt dich dieses Beispiel wieder in Bewegung.

<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

Vielen Dank für die falsche Schreibweise Hinweis. Da die Vorlage nicht funktioniert, bin ich verdächtig, dass es etwas mit dem XPath zu tun hat, das darin enthalten ist. – CodeMonkey1313