【问题标题】:WPF XML DataBindingWPF XML 数据绑定
【发布时间】:2009-06-30 01:38:29
【问题描述】:

我正在尝试做一些 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>

【问题讨论】:

    标签: wpf xml data-binding


    【解决方案1】:

    数据绑定很困难,因为它们往往会默默地失败,这使得它们很难调试。您在代码中遇到的第一个问题是 lbFiles ListBox 上的 ElementName 拼写错误。拼写错误将让你每次!在更正拼写错误、删除绑定的 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>
    

    【讨论】:

    • 感谢您指出拼写错误。至于模板不起作用,我怀疑它与其中提供的 XPath 有关。
    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多