Как связать свойство XmlDataProvider viewmodel с представлением XmlDataProvider?

Я пытаюсь отобразить некоторые данные XML в TreeView. Данные XML предоставляются свойством ViewModel типа XmlDataProvider. Однако я не могу связать его с TreeView. Я использую XmlDataProvider в XAML и не могу связать свойство ViewModel с XmlDataProvider в XAML. Ниже приведен фрагмент кода:

public class MainViewModel : ViewModelBase {


    private static XmlDataProvider  xDoc;
    public static XmlDataProvider  XDoc {
      get {
        return xDoc;
      }
      set {
        xDoc = value;
        RaisePropertyChanged( "XDoc" );
      }

    }


    public MainViewModel( ) {
      Data d = new Data( );
      d.int1 = 12;
      d.int2 = 20;
      d.str = "Hello World";

      XmlSerializer serializer = new XmlSerializer( d.GetType( ) );
      StringWriter strWriter = new StringWriter( );
      serializer.Serialize( strWriter, d );
      XDoc = new XmlDataProvider { Document =XDocument.Parse( strWriter.ToString( ) ).ToXmlDocument (), XPath="child::node"} ;    
    }
  }

XAML код:

<XmlDataProvider x:Key="xmlDP" Source="{ x:Static A:MainViewModel.XDoc}"  XPath="">
    </XmlDataProvider>
<TreeView Grid.Row="2" Grid.ColumnSpan="2" Name="xmlTree" 
       DataContext="{StaticResource xmlDP}" ItemsSource="{Binding}" ItemTemplate="{StaticResource treeViewTemplate}"/>

Я использую mvvm light framework. При попытке получить исключение, свойство XDoc должно быть статическим, и я не хочу делать его статическим.

Если определить мои данные X: внутри XmlDataProvider в файле xaml, то работает древовидная структура:

 <XmlDataProvider x:Key="xmlDP" XPath="">
            <x:XData>
                <Employees>
                    <Employee Name="Steven Ballmer" DOB="1-Mar-1956">
                        <Title>CEO</Title>
                    </Employee>
                </Employees>
            </x:XData>
        </XmlDataProvider>

 <TreeView Grid.Row="2" Grid.ColumnSpan="2" Name="xmlTree" 
           DataContext="{StaticResource xmlDP}" ItemsSource="{Binding}" ItemTemplate="  {StaticResource treeViewTemplate}"/>

2 ответа

Решение

Если я не использую XMLDataProvider и использую только XMLDoxument, тогда все работает как надо:

public class MainViewModel : ViewModelBase {


    private  XmlDocument  xDoc;
    public  XmlDocument  XDoc {
      get {
        return xDoc;
      }
      set {
        xDoc = value;
        RaisePropertyChanged( "XDoc" );
      }
    }

    public MainViewModel( ) {
      Data d = new Data( );
      d.int1 = 12;
      d.int2 = 20;
      d.str = "Hello World";


      XmlSerializer serializer = new XmlSerializer( d.GetType( ) );
      StringWriter strWriter = new StringWriter( );
      serializer.Serialize( strWriter, d );
      XDoc = XDocument.Parse( strWriter.ToString( ) ).ToXmlDocument () ;   
    }
  }

 <TreeView Grid.Row="2" Grid.ColumnSpan="2" Name="xmlTree" 
               ItemsSource="{Binding XDoc}" ItemTemplate="{StaticResource treeViewTemplate}"/>

проверьте эту ссылку.. в этой ссылке работа, которую вы хотели сделать.. означает, что данные XML в древовидном представлении сделаны.. так что просто проверьте это..

Другие вопросы по тегам