Загрузить XmlDataProvider в код

я озадачен

у меня есть xml-документ

<?xml version="1.0" encoding="utf-8"?>
<Reports>
  <Report Id="AAAAA-ABBB">
    <DocId>10110001</DocId>
    <DocName>ESP North Casing</DocName>
    <DocType>2010-01-01</DocType>
    <Status>1</Status>
    <CreatedById>1</CreatedById>
    <SiteId>1</SiteId>
    <Language>1</Language>
    <Updated>2011-01-01</Updated>
    <Published>2011-01-01</Published>
    <FilePath>c:\\reports\20011001.docx</FilePath>
  </Report>
  <Report Id="AAAAA-ABBC">
    <DocId>10110002</DocId>
    <DocName>ESP South Casing</DocName>
    <DocType>2010-01-01</DocType>
    <Status>1</Status>
    <CreatedById>1</CreatedById>
    <SiteId>1</SiteId>
    <Language>1</Language>
    <Updated>2011-01-01</Updated>
    <Published>2011-01-01</Published>
    <FilePath>c:\\reports\20011001.docx</FilePath>
  </Report>
</Reports>

Если я определяю статический xmldataprovider, например

 <UserControl.Resources>

    <XmlDataProvider x:Key="ReportData"
               Source="../DesignData/report.xml"
               XPath="Reports/Report" />

    <DataTemplate x:Key="teamItemTemplate">
        <Label Content="{Binding XPath=DocId}"/>
    </DataTemplate>
</UserControl.Resources>

И показать документ в списке

<ListBox x:Name="ReportListBox" Margin="60,12,114,64" DockPanel.Dock="Left"
             ItemsSource="{Binding 
         Source={StaticResource ReportData}}"

             ItemTemplate="{StaticResource teamItemTemplate}"
             IsSynchronizedWithCurrentItem="True"
             Visibility="Visible" SelectionMode="Single">
</ListBox>

Я вижу данные в списке

Если я сделаю то же самое в коде и загружу xmldataprovider в свою модель представления

  private XmlDataProvider GetXMLReports()
        {
              string filePath = Directory.GetCurrentDirectory() + @"\Data\report.xml";
              XmlDataProvider provider = new XmlDataProvider(); 
                System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
              doc.Load(filePath); 
              provider.Document = doc; 
              provider.XPath = "Reports/Report";
              //Reports = _provider;

              return provider;

        }

        public XmlDataProvider Reports
        {
            get { return _provider; }
            set
            {
                _provider = value;
                this.RaisePropertyChanged(() => this.Reports);
            }
        }

Если я установлю datacontext для модели представления и привяжу к свойству Report

<ListBox x:Name="ReportListBox" Margin="60,12,114,64" DockPanel.Dock="Left"
                 ItemsSource="{Binding Path=Reports}"

                 ItemTemplate="{StaticResource teamItemTemplate}"
                 IsSynchronizedWithCurrentItem="True"
                 Visibility="Visible" SelectionMode="Single">
    </ListBox>

Ничего не показано, никаких идей.


person klashagelqvist    schedule 23.01.2012    source источник
comment
Где вы на самом деле вызываете Bind() в коде?   -  person MethodMan    schedule 23.01.2012
comment
Я привязываю datacontext пользовательского контроля к модели представления. Если я поставлю точку останова, я увижу, что модель представления загружена.   -  person klashagelqvist    schedule 23.01.2012
comment
Это ваш точный код? Я спрашиваю только потому, что назначение свойств/уведомления кажется очень запутанным (например, Reports = _provider является избыточным, и событие должно быть вызвано в установщике)   -  person GazTheDestroyer    schedule 23.01.2012
comment
Спасибо за Ваш ответ. Я знаю о ваших возражениях по коду, это результаты моего тестирования, но они не влияют на функциональность, поэтому я оставил их. Я вставил отладочный преобразователь и вижу, что в привязке загружен правильный документ, но все еще ничего   -  person klashagelqvist    schedule 23.01.2012
comment
Изменен код по предложению г-на Газа   -  person klashagelqvist    schedule 23.01.2012


Ответы (1)


То, чего вы пытаетесь достичь, невозможно на самом деле.

В качестве обходного пути вы можете установить DataContext в ListBox следующим образом, и он должен работать:

     DataContext="{Binding Reports}"    
     ItemsSource="{Binding}"
person SvenG    schedule 23.01.2012
comment
Спасибо. Кажется, вы правы в своем предложении, оно работает, когда я устанавливаю контекст данных списка. Но ListBox не должен автоматически получать контекст данных из контекста данных Usercontrol. У меня есть много образцов с наблюдаемыми коллекциями, где я делаю то же самое, что и в вопросе, и это работает. Еще более странно то, что если я привязываюсь к статическому xmldataprovider, я могу видеть значения в конструкторе vs. - person klashagelqvist; 23.01.2012
comment
Извините, я не могу объяснить, почему это так, но, похоже, это внутренняя проблема в XMLDataProvider, есть аналогичные проблемы с привязкой свойства Source: stackoverflow.com/questions/1866942/ Итак, я предполагаю, что это внутренняя проблема в .net-фреймворк... - person SvenG; 23.01.2012