首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MVVM模式绑定xmldataprovider

使用MVVM模式绑定xmldataprovider
EN

Stack Overflow用户
提问于 2015-10-09 12:27:02
回答 1查看 808关注 0票数 0

我在wpf应用程序中有一个视图模型,它需要大量使用XML。为此,我使用的是XMLDataProvider,还有一些不依赖于XML的其他属性。

我的视图模型是这样的:

代码语言:javascript
复制
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代码是这样的:

代码语言:javascript
复制
<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提供程序设置为如下所示的内部网格:

代码语言:javascript
复制
<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>

所以我的问题是:

  1. 如何在不违反MVVM规则的情况下设置文档属性XmlDataProvider?
  2. 我还使用命令代替事件,但文档属性在ViewModel中不可用。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-09 16:14:03

@Ishan

这里有两个轨道来解决你的问题。

  1. 您可以使XmlDataProvider不是在ViewModel中实例化,而是在ViewModel代码中实例化。 所以您的XmlDataProvider代码中有一个ViewModel属性。

您的DataContext UserControl将是视图模型

代码语言:javascript
复制
<UserControl.DataContext>
    <local:ViewModel />
</UserControl.DataContext>

然后,按钮上的DataBinding可以使用“更多”聚焦的DataContext来制作:

代码语言:javascript
复制
<Button DataContext="{Binding Path=XmlDataProvider}" 
        Content="{Binding XPath=Some Xpath}"/>
  1. 我不会公开视图模型中的XmlDocument或XmlDataProvider属性,但我更愿意公开从Linq到XML实例化的一些.Net对象

问候

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33038305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档