gpt4 book ai didi

c# - 基于 XSD 架构的 Wpf XmlDataProvider 验证

转载 作者:行者123 更新时间:2023-11-30 17:07:20 26 4
gpt4 key购买 nike

我正在编写一个 c#(3.5 或 4,如果我找到原因的话)WPF 应用程序,它使用 XamlReader 动态加载 XAML 片段以显示可自定义的 UI。此 UI 在显示之前绑定(bind)到 XmlDataProvider,并且看起来工作得很好。

我一直在尝试找出是否可以让数据源(指向 XML 文档的 XmlDataProvider)根据文档的 XSD 模式自动验证?

澄清 - 由于应用程序的多变性质,我试图避免编写任何自定义验证规则。 XSD 模式具有指定的限制(例如正则表达式或最大长度限制),我希望我的 UI 以与 Winforms 错误提供程序类似的方式响应。

如有任何帮助,我们将不胜感激!

(顺便说一句 - 本来可以使用 XmlDataProvider 标记但由于信誉要求而无法创建新标记)

最佳答案

我曾遇到过类似的问题:动态加载 XAML 并验证用户输入。但在我的情况下,我有一个全局 DataContext 并且所有加载控件都绑定(bind)到该上下文。当执行验证操作时,例如用户按下按钮“验证”数据,DataContext 序列化为 XML,之后我使用 XSLT 从该 XML 中获取错误标记,但我认为如果可以的话您可以使用 XSD为该 XSD 序列化 DataContext

我的步骤:

  1. 加载 Xaml 并将我的对象设置为容器 DataContext

    String xaml="some xaml";
    MyData myData=new MyData();
    TextReader textReader = new StringReader(CardContext.Xaml);
    XmlReader xmlReader = XmlReader.Create(textReader);
    //setting DataContext for panel named 'content'
    this.content.DataContext = myData;
    FrameworkElement myContent = (FrameworkElement) XamlReader.Load(xmlReader);
    this.content.Children.Clear();
    this.content.Children.Add(myContent);
    InitMyComponents(this.content);
  2. xaml 中的控件绑定(bind)到 DataContext。DataContext 是 MyData 类:

    public class MyData
    {
    IDictionary<String, MyControl> MyControls{get;set;}
    ....
    }

    在哪里

    class MyControl
    {
    String Id{get;set;}
    String Name{get;set;}
    String Value{get;set;}
    }

    获取控件的绑定(bind)

    public static  Binding GetValueBinding(MyControl control)
    {
    Binding valueBinding = new Binding();
    valueBinding.Mode = BindingMode.TwoWay;
    valueBinding.Path = new PropertyPath("MyControls["+control.Id+"].Value");
    return valueBinding;
    }
  3. 用户使用控件并更改某些值。

  4. 当用户需要验证时,我将数据放在名为 MyMetaData 的 XSD 模式中(在该模式中我有表 MyControls)。

    MyMetaData _myMetaData;

    public void PushData(MyData myData)
    {

    foreach (MyControl control in myData.MyControls)
    {
    //fill table from xsd schema
    this._myMetaData.MyControls.AddMyControlsRow(control.Id,control.Name,control.Value);


    }

    this._myMetaData.AcceptChanges();
    }
  5. 从数据表中获取 XML

    this._myMetaData.MyControls.GetXml()
  6. 使用 xslt 验证 XML

    XslCompiledTransform xslCompiledTransform = new XslCompiledTransform(); 
    String xml = "some xml";
    TextReader textReader = new StringReader(xml );
    XmlReader xmlReader = XmlReader.Create(textReader);
    StringBuilder validationResult = new StringBuilder();
    XmlWriter xmlWriter = XmlWriter.Create(validationResult);
    //aply xslt (xslt return tags with error description and control Id)
    xslCompiledTransform.Transform(xmlReader, xmlWriter);
    //parsing result tags
    IList<ValidationError> parsedResult = ParseValidationResult(validationResult.ToString());
  7. 查找显示错误信息的控件和执行方法

    DependencyObject errorSource = LogicalTreeHelper.FindLogicalNode(this.content, error.Identifier);
    if (errorSource == null)
    return;
    if (errorSource is MyControl)
    (errorSource as MyControl).ShowErrorInfo(error.ErrorText);

这是我的算法,但如果您对 XSD 模式有一些限制,当您将数据放入 DataTable 时,您将在第 4 步中遇到错误。

关于c# - 基于 XSD 架构的 Wpf XmlDataProvider 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14633408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com