Wpf 绑定到XMLDataProvider
制作了一个简单的测试项目,在这个项目中,我尝试绑定到proto viewmodel中的xmldatasourceWpf 绑定到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() {
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);
}
}
}