Опубликован: 05.08.2010 | Уровень: специалист | Доступ: свободно
Лекция 3:

Привязка WPF к реляционным данным

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Вкладка Page5. Привязка интерфейса WPF к XML-данным с помощью класса XmlDataProvider

Класс XmlDataProvider позволяет создать логический ресурс из данных XML -формата и уже к нему привязывать интерфейс WPF. Рассмотрим это на простом примере.

  • В контейнер TabControl файла Window1.xaml добавьте вкладку Page5
<!-- Привязка к объекту с помощью класса XmlDataProvider -->
            <TabItem Header="Page5" Selector.IsSelected="True">
                <TabItem.Resources>
                    <XmlDataProvider
                        x:Key="myDocument" 
                        Source="Data/XmlDocument.xml" />
                </TabItem.Resources>
                <Grid DataContext="{Binding ElementName=listCustomers5, Path=SelectedItem}">
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="2*" />
                            <ColumnDefinition Width="1.5*" />
                            <ColumnDefinition Width="2*" />
                        </Grid.ColumnDefinitions>
                        
                        <TextBlock Grid.Column="0" HorizontalAlignment="Center">ContactName</TextBlock>
                        <ListBox Grid.Row="1" Grid.Column="0"
                            Name="listCustomers5"
                            Margin="0,0,0,3"
                            ScrollViewer.VerticalScrollBarVisibility="Auto"
                            ItemsSource="{Binding Source={StaticResource myDocument},
                                                  XPath=NewDataSet/Customers}"
                            DisplayMemberPath="ContactName"
                            IsSynchronizedWithCurrentItem="True"
                            />
                        
                        <TextBlock Grid.Column="1" HorizontalAlignment="Center">CustomerID</TextBlock>
                        <ListBox Grid.Row="1" Grid.Column="1"
                            Margin="0,0,0,3"
                            ScrollViewer.VerticalScrollBarVisibility="Auto"
                            ItemsSource="{Binding Source={StaticResource myDocument},
                                                  XPath=NewDataSet/Orders}"
                            DisplayMemberPath="CustomerID"
                            />
                        
                        <TextBlock Grid.Column="2" HorizontalAlignment="Center">ProductName</TextBlock>
                        <ListBox Grid.Row="1" Grid.Column="2"
                            Margin="0,0,0,3"
                            ScrollViewer.VerticalScrollBarVisibility="Auto"
                            ItemsSource="{Binding Source={StaticResource myDocument},
                                                  XPath=NewDataSet/Order_Details_Extended}"
                            DisplayMemberPath="ProductName"
                            />
                    </Grid>
                    <Grid Grid.Row="1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        
                        <TextBlock Grid.Row="0" Margin="0,0,5,0">CompanyName:</TextBlock>
                        <TextBox Grid.Row="0" Grid.Column="1" 
                            Text="{Binding XPath=CompanyName, Mode=OneWay}"
                            Focusable="False"
                            Margin="5,0,0,0"
                            />
                        
                        <TextBlock Grid.Row="1">Address:</TextBlock>
                        <TextBox Grid.Row="1" Grid.Column="1" 
                            Text="{Binding XPath=Address, Mode=OneWay}"
                            Focusable="False"
                            Margin="5,0,0,0"
                            />
                        
                        <TextBlock Grid.Row="2">City:</TextBlock>
                        <TextBox Grid.Row="2" Grid.Column="1" 
                            Text="{Binding XPath=City, Mode=OneWay}"
                            Focusable="False"
                            Margin="5,0,0,0"
                            />
                        
                        <TextBlock Grid.Row="3">Country:</TextBlock>
                        <TextBox Grid.Row="3" Grid.Column="1" 
                            Text="{Binding XPath=Country, Mode=OneWay}"
                            Focusable="False"
                            Margin="5,0,0,0"
                           />
                    </Grid>
                </Grid>
            </TabItem>
  • В файл Window1.xaml.cs добавьте код создания XML -документа
public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
    
            Page1();
            Page2();
            Page3();
            Page5();
        }
        ............................................................
    
        #region Вкладка Page5
        void Page5()
        {
            // Готовим путь к сохранению XML-документа
            String path;
            //path = System.Environment.CurrentDirectory + "\\Data";//Вариант 1
            path = AppDomain.CurrentDomain.BaseDirectory + "Data";  //Вариант 2
            string fileName = System.IO.Path.Combine(path, "XmlDocument.xml");
    
            // Создаем только раз
            if (System.IO.File.Exists(fileName))
                return;
    
            // Создаем заполненный реляционный набор данных 
            MyObject myObject = new MyObject();
            DataSet dataSet = myObject.GetCollection();
    
            // Создаем XML-документ и загружаем его данными набора
            System.Xml.XmlDataDocument document =
                new System.Xml.XmlDataDocument(dataSet);
    
            // Сохраняем документ в файле
            document.Save(fileName);
    
            // Бросаем набор и документ (для очевидности!) 
            dataSet.Dispose();
            document = null;
    
            // Вызываем сборщик мусора (для разнообразия!)
            GC.WaitForFullGCComplete(); // Ждать завершения сборки мусора
            GC.Collect();               // Начать сборку мусора
        }
        #endregion
    }
  • Запустите приложение, чтобы создать XML -документ
  • В панели Solution Explorer для узла Data выполните команду Add/Existing Item и присоедините к проекту файл XmlDocument.xml из папки Data, дочерней к каталогу нахождения исполнимой сборки приложения ( bin\Debug\Data или bin\Release\Data ). Без последнего действия при запуске через оболочку вкладка Page5 работать не будет, а при запуске напрямую через исполнимую сборку - будет
  • Проследите, чтобы свойства присоединенного файла XmlDocument.xml в панели Properties были
    • Build Action=Content
    • Copy to Output Directory=Copy if newer
  • Запустите приложение - вкладка Page5 работает частично!!!

Атрибут IsSynchronizedWithCurrentItem="True" из именованного списка listCustomers5 можно удалить, но тогда текстовые поля получат первое значение только при выделении элемента списка.

  • Найдите в подкаталоге Data папки размещения исполнимой сборки файл XmlDocument.xml и откройте его

Мы видим, что все реляционные зависимости между таблицами при преобразовании из набора DataSet в XML -формат были утрачены, поэтому нам не удалось построить такую же функциональность, как в предыдущих примерах. Но пример применения класса XmlDataProvider в качестве источника данных для привязываемых элементов интерфейса WPF мы все-таки рассмотрели и отправную точку для более глубокого изучения обозначили.

Дальше сами: автобусом до сходней, а там по шпалам, опять по шпалам...!


< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?

Юрий Макушин
Юрий Макушин
Россия, Москва, РЭА им. Плеханова, 2004