使用 MVVM 模式绑定 xmldataprovider
Bind xmldataprovider using MVVM pattern
我在 wpf 应用程序中有一个视图模型,它需要高使用率 XML。为此,我使用 XMLDataProvider,还有一些不依赖于 XML 的其他属性。
所以我的视图模型如下所示:
public class ViewModel : ViewModelBase
{
private XmlDocument _xmlDataProvider;
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
base.RaisePropertyChangedEvent("Name");
}
}
public XmlDocument XmlDataProvider
{
get { return _xmlDataProvider; }
set
{
_xmlDataProvider = value;
base.RaisePropertyChangedEvent("XmlDataProvider");
}
}
}
我的 XAML 代码如下所示:
<UserControl x:Name="ctrlTemplate" x:Class= "CtrlTemplate"
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"
xmlns:local="clr-namespace:WPFControl.UI"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:xckt="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
mc:Ignorable="d"
DataContext="{DynamicResource ViewModel}">
<UserControl.Resources>
<local:ViewModel x:Key="ViewModel" />
</ResourceDictionary>
</UserControl.Resources>
我想将 xml 提供程序设置为内部网格,如下所示:
<Grid x:Name="grdFill" Margin="0" RenderTransformOrigin="0.502,0.492" HorizontalAlignment="Left">
<Grid.DataContext>
<XmlDataProvider x:Name="template" Document="{Binding XmlDataProvider}"/> **This is not possible as Document is not a Dependency property**
</Grid.DataContext>
<StackPanel>
<Button ="{Binding XPath=Some Xpath}"/>
<Button Content="{Binding Name, Source={StaticResource ViewModel}}"/>
</StackPanel>
</Grid>
所以我的问题是:
如何在不违反 MVVM 规则的情况下设置 XmlDataProvider 的 Document 属性?
我也在使用命令代替事件,但是 文档 属性 在 ViewModel 中不可用。
@伊山,
这里有两条路线可以解决您的问题。
- 您可以使 XmlDataProvider 不在 XML 中实例化,而是在 ViewModel 代码中实例化。
所以你在 ViewModel Code 中会有一个 XmlDataProvider 属性
您的 UserControl 的 DataContext 将是视图模型
<UserControl.DataContext>
<local:ViewModel />
</UserControl.DataContext>
然后按钮上的数据绑定可以使用 "more" 聚焦的 DataContext 来实现:
<Button DataContext="{Binding Path=XmlDataProvider}"
Content="{Binding XPath=Some Xpath}"/>
- 个人而言,我不会从视图模型公开 XmlDocument 或 XmlDataProvider 属性,但我更愿意公开一些从 Linq 实例化的 .Net 对象 XML
此致
我在 wpf 应用程序中有一个视图模型,它需要高使用率 XML。为此,我使用 XMLDataProvider,还有一些不依赖于 XML 的其他属性。
所以我的视图模型如下所示:
public class ViewModel : ViewModelBase
{
private XmlDocument _xmlDataProvider;
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
base.RaisePropertyChangedEvent("Name");
}
}
public XmlDocument XmlDataProvider
{
get { return _xmlDataProvider; }
set
{
_xmlDataProvider = value;
base.RaisePropertyChangedEvent("XmlDataProvider");
}
}
}
我的 XAML 代码如下所示:
<UserControl x:Name="ctrlTemplate" x:Class= "CtrlTemplate"
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"
xmlns:local="clr-namespace:WPFControl.UI"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:xckt="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
mc:Ignorable="d"
DataContext="{DynamicResource ViewModel}">
<UserControl.Resources>
<local:ViewModel x:Key="ViewModel" />
</ResourceDictionary>
</UserControl.Resources>
我想将 xml 提供程序设置为内部网格,如下所示:
<Grid x:Name="grdFill" Margin="0" RenderTransformOrigin="0.502,0.492" HorizontalAlignment="Left">
<Grid.DataContext>
<XmlDataProvider x:Name="template" Document="{Binding XmlDataProvider}"/> **This is not possible as Document is not a Dependency property**
</Grid.DataContext>
<StackPanel>
<Button ="{Binding XPath=Some Xpath}"/>
<Button Content="{Binding Name, Source={StaticResource ViewModel}}"/>
</StackPanel>
</Grid>
所以我的问题是:
如何在不违反 MVVM 规则的情况下设置 XmlDataProvider 的 Document 属性?
我也在使用命令代替事件,但是 文档 属性 在 ViewModel 中不可用。
@伊山,
这里有两条路线可以解决您的问题。
- 您可以使 XmlDataProvider 不在 XML 中实例化,而是在 ViewModel 代码中实例化。
所以你在 ViewModel Code 中会有一个 XmlDataProvider 属性
您的 UserControl 的 DataContext 将是视图模型
<UserControl.DataContext>
<local:ViewModel />
</UserControl.DataContext>
然后按钮上的数据绑定可以使用 "more" 聚焦的 DataContext 来实现:
<Button DataContext="{Binding Path=XmlDataProvider}"
Content="{Binding XPath=Some Xpath}"/>
- 个人而言,我不会从视图模型公开 XmlDocument 或 XmlDataProvider 属性,但我更愿意公开一些从 Linq 实例化的 .Net 对象 XML
此致