Wpf 绑定到XMLDataProvider

Wpf 绑定到XMLDataProvider,wpf,binding,xmldatasource,Wpf,Binding,Xmldatasource,制作了一个简单的测试项目,在这个项目中,我尝试绑定到proto viewmodel中的xmldatasource public partial class Window1 : Window { //private XmlDataProvider _provider = new XmlDataProvider(); private MyViewModel _myViewModel = new MyViewModel(); public Window1() {

制作了一个简单的测试项目,在这个项目中,我尝试绑定到proto viewmodel中的xmldatasource

public partial class Window1 : Window
{
    //private XmlDataProvider _provider = new XmlDataProvider(); 
    private MyViewModel _myViewModel = new MyViewModel();
    public Window1()
    {
        InitializeComponent();
        this.DataContext = _myViewModel ;
    }    
}

public class MyViewModel
{    
    public MyViewModel()
    {
        LoadXMLData();
    }

    private XmlDataProvider _provider = new XmlDataProvider(); 
    public XmlDataProvider Reports
    {
        get { return _provider; }
        set { _provider = value; }
    }    

    private void LoadXMLData()
    {
        string filePath = Directory.GetCurrentDirectory() + @"\Reports2.xml";

        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        doc.Load(filePath);
        _provider.Document = doc;
        _provider.XPath = @"Reports/Report";
    }
}
如果我尝试像这样绑定一个列表框。我什么也得不到

<ListBox x:Name="TeamsListBox" Margin="0,0,0,20" DockPanel.Dock="Left"
    ItemsSource="{Binding Reports}"
    ItemTemplate="{StaticResource teamItemTemplate}"
    IsSynchronizedWithCurrentItem="True"
    Visibility="Visible" SelectionMode="Single">
</ListBox>
和列表框到

<ListBox x:Name="TeamsListBox" Margin="0,0,0,20" DockPanel.Dock="Left"
    ItemsSource="{Binding}"
    ItemTemplate="{StaticResource teamItemTemplate}"
    IsSynchronizedWithCurrentItem="True"
    Visibility="Visible" SelectionMode="Single">
</ListBox>

为什么我不能在XAML中这样做似乎我在理解XPath时遇到了一些问题,我的一般问题是如何使用XAML绑定到viewmodel中的动态xmldataprovider。就这样解决了

XML


30110001
报告名称1
2010-01-01
1.
1.
1.
1.
2011-01-01
2011-01-01
c:\\reports\20011001.docx
30110002
报告名称2
2010-01-01
1.
1.
1.
1.
2011-01-01
2011-01-01
c:\\reports\20011001.docx
窗口1

    <Window x:Class="WpfApplication2.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
              Title="Window1" Height="300" Width="300">
        <Window.Resources>

            <DataTemplate x:Key="reportItemTemplate">
                <StackPanel Orientation="Horizontal">
                <Label Content="{Binding XPath=DocId}"/>
                    <Label Content="{Binding XPath=DocName}"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
        <StackPanel  DataContext="{Binding LocalReports}" >
            <ListBox  

            ItemsSource="{Binding}"
                ItemTemplate="{StaticResource reportItemTemplate}"
                         IsSynchronizedWithCurrentItem="True"
                         Visibility="Visible" SelectionMode="Single"
                />
            <TextBox Text="{Binding XPath=DocId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            <TextBox Text="{Binding XPath=DocName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            <Button Content="Button" Height="23" Name="button1" Click="button1_Click" />
        </StackPanel>

    </Window> 

Window1.xaml.cs

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        //private XmlDataProvider _provider = new XmlDataProvider(); 
        private MyViewModel _myViewModel = new MyViewModel();

        public Window1()
        {
            InitializeComponent();

            this.DataContext = _myViewModel;


        }


         private void button1_Click(object sender, RoutedEventArgs e)
         {
             _myViewModel.Save();
         }

    }

    public class MyViewModel
    {

        public MyViewModel()
        {
                      }

        private XmlDataProvider _provider;
        public XmlDataProvider LocalReports
        {

            get
            {
                String file = Directory.GetCurrentDirectory() + @"\Reports2.xml";
                _provider = new XmlDataProvider()
                {
                    Source = new Uri(file, UriKind.Absolute),
                    XPath = "Reports/Report"
                };
                return _provider;
            }
        }



        }


        public  void Save()
        {
            string source = _provider.Source.LocalPath;
            _provider.Document.Save(source);
        }
    }
}
命名空间WpfApplication2
{
/// 
///Window1.xaml的交互逻辑
/// 
公共部分类Window1:Window
{
//私有XmlDataProvider_provider=新XmlDataProvider();
私有MyViewModel_MyViewModel=新的MyViewModel();
公共窗口1()
{
初始化组件();
this.DataContext=\u myViewModel;
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
_myViewModel.Save();
}
}
公共类MyViewModel
{
公共MyViewModel()
{
}
私有XmlDataProvider\u提供者;
公共XmlDataProvider本地报告
{
收到
{
字符串文件=Directory.GetCurrentDirectory()++“\Reports2.xml”;
_provider=新的XmlDataProvider()
{
Source=新Uri(文件,UriKind.Absolute),
XPath=“报告/报告”
};
返回提供程序;
}
}
}
公共作废保存()
{
字符串源=_provider.source.LocalPath;
_provider.Document.Save(源);
}
}
}

来自您的代码:
this.DataContext=\u myViewModel.Person
什么是
Person
属性?我在你的viewmodel上看不到它。您的意思是
\u myViewModel.Reports
?抱歉,将其更改为Reports。它是原始编解码器中的报告,但与xmldatasource有关的内容不可IEnumberable。但是如果是这样的话,当我设置datacontext时,它会工作,那么在后台一定会进行一些自动转换
<?xml version="1.0" encoding="utf-8"?>
<Reports xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Report Id="AAAAA-ABBB">
    <DocId>30110001</DocId>
    <DocName>Report name1</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>30110002</DocId>
    <DocName>Report name2</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>
    <Window x:Class="WpfApplication2.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
              Title="Window1" Height="300" Width="300">
        <Window.Resources>

            <DataTemplate x:Key="reportItemTemplate">
                <StackPanel Orientation="Horizontal">
                <Label Content="{Binding XPath=DocId}"/>
                    <Label Content="{Binding XPath=DocName}"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
        <StackPanel  DataContext="{Binding LocalReports}" >
            <ListBox  

            ItemsSource="{Binding}"
                ItemTemplate="{StaticResource reportItemTemplate}"
                         IsSynchronizedWithCurrentItem="True"
                         Visibility="Visible" SelectionMode="Single"
                />
            <TextBox Text="{Binding XPath=DocId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            <TextBox Text="{Binding XPath=DocName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            <Button Content="Button" Height="23" Name="button1" Click="button1_Click" />
        </StackPanel>

    </Window> 
namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        //private XmlDataProvider _provider = new XmlDataProvider(); 
        private MyViewModel _myViewModel = new MyViewModel();

        public Window1()
        {
            InitializeComponent();

            this.DataContext = _myViewModel;


        }


         private void button1_Click(object sender, RoutedEventArgs e)
         {
             _myViewModel.Save();
         }

    }

    public class MyViewModel
    {

        public MyViewModel()
        {
                      }

        private XmlDataProvider _provider;
        public XmlDataProvider LocalReports
        {

            get
            {
                String file = Directory.GetCurrentDirectory() + @"\Reports2.xml";
                _provider = new XmlDataProvider()
                {
                    Source = new Uri(file, UriKind.Absolute),
                    XPath = "Reports/Report"
                };
                return _provider;
            }
        }



        }


        public  void Save()
        {
            string source = _provider.Source.LocalPath;
            _provider.Document.Save(source);
        }
    }
}