Нужна помощь в подключении XML-файла к WPF DataGrid - PullRequest
0 голосов
/ 11 ноября 2009

Вот что я сделал до сих пор:

  1. В моем классе App я объявляю новый XmlDataProvider и устанавливаю в качестве источника допустимый XML-файл (для которого для параметра «Действие построения» установлено значение «Содержимое / Всегда копировать»).

    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
            var services = new XmlDataProvider();
            services.Source = new Uri("pack://siteoforigin:,,,/Data/Services.xml"); // also tried an absolute path, but that made no difference
            var mainWindow = new MainWindow();
            mainWindow.DataContext = new MainViewModel(services);
            mainWindow.Show();
        }
    }
    
  2. XmlDataProvider передается в ViewModel и присваивается свойству Services.

  3. Я привязываюсь к таким данным:

    <mwc:DataGrid
        ItemsSource="{Binding Services, XPath=//Services/*}">
        <mwc:DataGrid.Columns>
            <mwc:DataGridTextColumn
                Binding="{Binding XPath=@name}"
                Header="Name" />
            <mwc:DataGridTextColumn ... />
            ...
        </mwc:DataGrid.Columns>
    </mwc:DataGrid>
    

Результат:

Заголовки столбцов моего DataGrid отображаются, но нет строк данных. Он компилируется и запускается без каких-либо ошибок, но если я проверяю свое окно вывода, я вижу это:

BindingExpression with XPath cannot bind to non-XML object.;
XPath='//Services/*'
BindingExpression:Path=Services;

Может ли XmlDataProvider использоваться только декларативно?

Если я попытаюсь декларативно создать XmlDataProvider в ResourceDictionary, как это ...

<XmlDataProvider
    x:Key="Main_Services">
    <x:XData>
        <Services
            xmlns="">
            <Service
                name="Test"
                ... />
            <Service ... />
            ...
        </Services>
    </x:XData>
</XmlDataProvider>

... все работает нормально (я получаю ожидаемые строки в моем DataGrid). (Обратите внимание, что я просто вставил содержимое файла XML между тегами <x:XData>.)

Если я попытаюсь установить Source через C #, в XmlDataProvider, похоже, не будет никаких данных (буквально, свойство Data равно нулю).

Похоже, не имеет значения, использую ли я "pack URI" или абсолютный путь, когда присваиваю Source. Я не получаю строк в любом случае. Я также попытался вызвать метод InitialLoad() после установки источника, но это тоже не имело значения.

Вопросы:

  • XmlDataProvider - не тот инструмент, который подходит для работы, или я что-то не так делаю?
  • Может ли XmlDataProvider использоваться только декларативно?
  • Я знаю, что есть XDocument и XmlDocument ... я должен использовать один из них?

1 Ответ

1 голос
/ 12 ноября 2009

Декларативный, кажется, путь. Этот код работает:

<XmlDataProvider
    x:Key="Main_Services"
    Source="pack://siteoforigin:,,,/Data/Services.xml">
</XmlDataProvider>

Я понятия не имею, почему выполнить то же самое в C # не удается, но я могу жить с этим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...