【问题标题】:Bind xmldataprovider using MVVM pattern使用 MVVM 模式绑定 xmldataprovider
【发布时间】:2015-10-09 12:27:02
【问题描述】:

我在 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>

所以我的问题是:

  1. 如何在不违反 MVVM 规则的情况下设置 XmlDataProvider 的 Document 属性?

  2. 我也在使用命令代替事件,但 Document 属性在 ViewModel 中不可用。

【问题讨论】:

  • 我不确定第二个问题是什么

标签: c# wpf xaml mvvm xmldataprovider


【解决方案1】:

@伊山,

这里有两条路线可以解决您的问题。

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

您的 UserControl 的 DataContext 将是视图模型

<UserControl.DataContext>
    <local:ViewModel />
</UserControl.DataContext>

然后您的按钮上的 DataBinding 可以使用“更”集中的 DataContext 进行:

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

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 2011-11-05
    • 2012-01-11
    • 2020-01-08
    • 2023-03-17
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多