2012-01-14 6 views
2

У меня есть довольно простой вопрос.Загрузка/сохранение данных DataGrid XML

Как я могу получить DataGrid в WPF для сохранения/загрузки необработанных XML-файлов и иметь возможность отображать/редактировать их с помощью других элементов управления? Приложение будет работать только в автономном режиме, поэтому мне не понадобится SQL. Просто просто откройте, отредактируйте и сохраните данные в XML.

Мои предыдущие проекты с WinForms включали создание DataSet (xsd-файла) и DataTable, привязанных к DataGridView. Затем добавьте новые элементы, нажав «AddDataTableRow()». Сохраните/прочитайте XML-файлы с помощью «ReadXML», «WriteXML».

Я новичок в WPF, поэтому любая помощь будет очень оценена.

ответ

1

очень простой подход был бы просто определить класс сбора данных (ObservableCollection, содержащий экземпляры класса данных, который реализует INotifyPropertyChanged), пометить эти классы как сериализация и использовать XmlSerializer для сериализации/десериализации.

класс выборки данных:

[Serializable] 
public class Person : INotifyPropertyChanged 
{ 
    private string firstName; 
    private string lastName; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string FirstName 
    { 
     get { return firstName; } 
     set 
     { 
      firstName = value; 
      NotifyPropertyChanged("FirstName"); 
     } 
    } 

    public string LastName 
    { 
     get { return lastName; } 
     set 
     { 
      lastName = value; 
      NotifyPropertyChanged("LastName"); 
     } 
    } 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

и класс сбора данных:

[Serializable] 
public class PersonCollection : ObservableCollection<Person> 
{ 
} 

Некоторые XAML:

<Window x:Class="DataGrid.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:DataGridTest" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <local:PersonCollection x:Key="PersonCollection"/> 
     <CollectionViewSource x:Key="PersonCollectionViewSource" Source="{StaticResource PersonCollection}"/> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <DataGrid Name="dataGrid" Margin="2" ItemsSource="{Binding Source={StaticResource PersonCollectionViewSource}}"/> 
     <StackPanel Grid.Row="1" Margin="2" Orientation="Horizontal" HorizontalAlignment="Right"> 
      <Button Content="Save" Click="Button_Click"/> 
     </StackPanel> 
    </Grid> 
</Window> 

И класс MainWindow с кодом deseralization в конструкторе код сериализации в обработчике щелчка кнопки:

public partial class MainWindow : Window 
{ 
    private PersonCollection persons; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     persons = (PersonCollection)Resources["PersonCollection"]; 

     XmlSerializer serializer = new XmlSerializer(typeof(PersonCollection)); 

     using (FileStream stream = new FileStream("Persons.xml", FileMode.Open)) 
     { 
      IEnumerable<Person> personData = (IEnumerable<Person>)serializer.Deserialize(stream); 

      foreach (Person p in personData) 
      { 
       persons.Add(p); 
      } 
     } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(PersonCollection)); 

     using (FileStream stream = new FileStream("Persons.xml", FileMode.Create)) 
     { 
      serializer.Serialize(stream, persons); 
     } 
    } 
} 
+0

Спасибо за ответ, но он вызывает несколько ошибок. («local» - необъявленный префикс. Строка 6, позиция 10. «XML недопустим.) и (имя« лица »не существует в текущем контексте). После преобразования кода в VB эти ошибки все же остались. – Crossfire

+0

Извините за неудобства, я ушел. «local» - это только объявление пространства имен XAML для пространства имен, в котором находится класс PersonCollection, «DataGridTest» в моем примере. «people» является переменной-членом класса MainWindow. Я редактировал образец кода XAML. Замените «DataGridTest» пространством имен вашего проекта. – Clemens

+0

Любые успехи с образцом кода? – Clemens

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