2009-06-30 4 views
0

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

ответ

3

Привязки данных жестки, поскольку они, как правило, не в состоянии бесшумно, что делает их очень трудно отлаживать. Проблема номер один, которую вы имели в вашем коде, была ошибкой ElementName в lbFiles ListBox. Ошибки будут получать вас каждый раз! Я смог получить имена Файлов, которые появятся после исправления ошибки орфографии, удаления части 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 [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

Спасибо за указание на опечатку. Что касается шаблона, который не работает, я подозрюю, что он имеет какое-то отношение к предоставленному в нем XPath. – CodeMonkey1313