2013-12-09 5 views
0

Я пытаюсь заполнить datagrid, который находится внутри usercontrol, используя данные из XElement. Datagrid строит строки, но внутри них нет значений. Я получаю System.Windows.Data Error: 40 : BindingExpression path error: 'Value' property not found on 'object', показывая в окне вывода. Не уверен, что я делаю неправильно, я видел несколько примеров, используя этот подход. Я думаю, что это может иметь какое-то отношение к местоположению datagrid, которое находится внутри usercontrol, но не уверен.Заполнение WPat datagrid с помощью XElement

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

Вы должны использовать индекс с элементом. как: - Элементы [ставка] [1] .Value. –

ответ

1

Вы почти там, но одна маленькая проблема - Binding for column will be a collection of XElements (так как вы связываете к коллекции элементов) , Вы должны получить 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> 
+1

Это исправлено! Благодаря!! – Wallace

Смежные вопросы