2014-02-12 12 views
-2

У меня есть XML-файл, как показано ниже. Я планирую связать содержимое XML-файла с Datagrid в WPF.WPF, XML Datagrid Binding

<?xml version="1.0" encoding="utf-8"?> 
<ProductData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<PurchaseOrderLine> 
    <ProductItem> 
     <LineNumber>1</LineNumber> 
    </ProductItem> 
</PurchaseOrderLine> 

Так я разрабатываю два простых классов для PurchaseOrderLine и ProductItem ниже

class PurchaseOrderLine { 
    public ProductItem productItem { get; set; }} 

class ProductItem{ 
    public int LineNumber { get; set; }} 

После этого, когда я пытался получить к нему доступ в XAML что-то, как показано ниже, я не мог получить LINENUMBER подробности, почему что? Я что-то пропустил? На самом деле, пожалуйста, дайте мне знать, как получить доступ к дочерним элементам в xml?

<DataGrid AutoGenerateColumns="False" Name="dataGrid" ItemsSource="{Binding Path=Elements[PurchaseOrderLine]}" Height="214" Width="657"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Line Number" Binding="{Binding Path = Element[ProductItem.LineNumber].Value}" /> 
</DataGrid.Columns> 

Я загрузив файл XML динамически

 var productList = XElement.Load(FileName); 
     this.dataGrid.DataContext = productList; 
+1

Вы попробовали строчный «ProductItem» в своем втором привязке (то есть «productItem»)? XAML чувствителен к регистру к моему воспоминанию. Вы получаете какие-либо исключения System.Data в окне вывода? – BradleyDotNET

+0

@ LordTakkera, это правильный способ доступа к элементам, таким как ProductItem.LineNumber. Потому что я попробовал с productItem.LineNumber тоже. Он не работает – RobinAtTech

+0

Обычно это то, что вы бы сделали (с нижним регистром, учитывая ваше имя свойства). Я не уверен, почему это будет какое-то другое чтение XML-документа. Вы пытались удалить «Элемент» со второго привязки? Если объект уже является контекстом данных, он может больше не быть XElement и, следовательно, не нуждается в этой части. Исключения System.Data могут помочь вам здесь. – BradleyDotNET

ответ

1

К сожалению, у меня нет большого опыта с XElement, но вы могли использовать сериалайзер. Есть два доступных в .NET, XMLSerializer и DataContractSerializer (оба основаны на XML). Обычно я использую DataContractSerializer, хотя принцип тот же в другом.

использовать его, первый знак ваших классов данных как DataContracts:

[DataContract] 
public class PurchaseOrderLine { 
    [DataMember] 
    public ProductItem productItem { get; set; }} 

[DataContract] 
public class ProductItem{ 
    [DataMember] 
    public int LineNumber { get; set; }} 

Тогда просто использовать сериалайзер для заполнения списка:

using FileStream fs = new FileStream(fileName, 
      FileMode.Open)) 
{ 
    DataContractSerializer ser = new DataContractSerializer(typeof(List<PurchasOrderLine>)); 

    List<PurchasOrderLine> productList= 
       (List<PurchasOrderLine>)ser.ReadObject(fs); 

    this.dataGrid.DataContext = productList; 
} 

Тогда вы связываете, как они были просто обычные объекты :

<DataGrid AutoGenerateColumns="False" Name="dataGrid" ItemsSource="{Binding Path=PurchaseOrderLine}" Height="214" Width="657"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Line Number" Binding="{Binding Path=productItem.LineNumber.Value}" /> 
</DataGrid.Columns> 

Отметьте, что я свяжу источник данных DataGrid с "productList "(отображается как общедоступное свойство виртуальной машины) вместо набора DataContext, поэтому, если этот код не работает, вы можете попробовать это.

Удачи, и дайте мне знать, могу ли я исправить или прояснить что угодно!

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