使用XElement填充WPF数据网格

时间:2013-12-09 06:50:14

标签: c# wpf xaml

我正在尝试使用来自XElement的数据填充位于usercontrol内的datagrid。数据网格构建行,但它们内部没有显示任何值。我在输出窗口中显示System.Windows.Data Error: 40 : BindingExpression path error: 'Value' property not found on 'object'。不知道我做错了什么,我看过几个使用这种方法的例子。我认为它可能与datagrid的位置有关,它位于用户控件内部,但不确定。

XElement:

<root>
    <option symbol="AAPL131221P00700000" type="P">
        <strikePrice>700</strikePrice>
        <lastPrice>179.53</lastPrice>
        <change>0</change>
        <changeDir />
        <bid>NaN</bid>
        <ask>NaN</ask>
        <vol>30</vol>
        <openInt>60</openInt>
    </option>
</root>

XAML:

<UserControl x:Class="OptionWPF.DataPane"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="3*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <DataGrid AutoGenerateColumns="False"
              Grid.Row="0"
              RowHeaderWidth="0"
              AlternationCount="2"
              x:Name="DGrid"
              ItemsSource="{Binding Path=Elements[option]}">

        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path = Elements[bid].Value}"
                              Header="Bid" IsReadOnly="True"/>
            <DataGridTextColumn Binding="{Binding Path=Elements[ask].Value}"
                              Header="Ask" IsReadOnly="True"/>

        </DataGrid.Columns>
    </DataGrid>
    <Button x:Name="button2" Grid.Row="1" Click="button_Click"/>

</Grid>
</UserControl>

CS:

private void button_Click(object sender, RoutedEventArgs e) 
    {
        XElement xdoc = new XElement("root");
        YahooData data = new YahooData("AAPL");            
        IEnumerable<XElement> doc = data.Document;
        xdoc.Add(doc);
        DGrid.DataContext = xdoc;
    }

1 个答案:

答案 0 :(得分:1)

你几乎只有一个小问题 - Binding for column will be a collection of XElements(因为你绑定到Elements集合)。你需要得到first index value并且你会很高兴。

这将有效 -

<DataGrid.Columns>
   <DataGridTextColumn Binding="{Binding Path = Elements[bid][0].Value}"
                       Header="Bid" IsReadOnly="True"/>
   <DataGridTextColumn Binding="{Binding Path=Elements[ask][0].Value}"
                       Header="Ask" IsReadOnly="True"/>

</DataGrid.Columns>