首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让最基本的MetaDataType正常工作

让最基本的MetaDataType正常工作
EN

Stack Overflow用户
提问于 2017-07-15 23:27:20
回答 1查看 91关注 0票数 2

除了我最初的帖子之外,我想我需要提到我正在使用Prism 6.3。显然,编译器不喜欢添加到元数据类中的内容,这些内容不在原始的部分中。不确定如何解决此问题。再次感谢..。边缘

好吧,我投降,叔叔!

我正在尝试向我的wpf实体框架应用程序添加数据注释。我已经尝试了6种方法去周日,但都没有成功。我把我认为最简单的例子放在一起,并遵循所有的说明……毫无办法。开始吧。我有一个由EF生成的类(db优先)。

代码语言:javascript
复制
namespace junk.DataModels
{
    public partial class MyClass
    {
        public string SomeText { get; set; }
    }
}

我有另一个包含以下分部类的文件:

代码语言:javascript
复制
namespace junk.DataModels
{
    [MetadataType(typeof(MyClassMetaData))]
    public partial class MyClass
    {
    }

    public partial class MyClassMetaData
    {
      private string _someText;
      [Required(ErrorMessage = "Required")]
      public string SomeText 
      {
          get { return _someText; }
          set { SetProperty(ref _someText, value); }
      }
    }
}

在我的ViewModel中,我定义:

代码语言:javascript
复制
private MyClass _mc;
public MyClass MC
{
    get { return _mc; }
    set
    {
        SetProperty(ref _mc, value);
    }
}

在构造函数中:

代码语言:javascript
复制
MC = new MC();
MC.SomeText = "Hello World.";

最后,在我的xaml中:

我有一个绑定的控件:

代码语言:javascript
复制
<TextBox x:Name="txt" Text="{Binding MC.SomeText, 
        ValidatesOnDataErrors=True, 
        ValidatesOnExceptions=True,
        ValidatesOnNotifyDataErrors=True,
        UpdateSourceTrigger=PropertyChanged }"
 />

根据我所读到的所有内容,如果我运行它并清除文本框,我应该会得到一个验证错误。我已经尝试了"ValidatesOn“的所有组合,似乎没有什么不同。能不能有人可怜我,分享我的秘方?我一定漏掉了一些简单的东西。如果我绑定到元类,它可以工作,但这有点违背了目的。

任何帮助都是最好的!

EN

回答 1

Stack Overflow用户

发布于 2018-01-09 18:43:52

尝试将以下静态构造函数添加到伙伴类"MyClass“中。它将根据您的EF类注册元数据,以便Validator可以找到数据注释:

代码语言:javascript
复制
static MyClass()
{
    // Register the metadata against our EF data object. 
    // This will ensure the Validator find the annotations
    TypeDescriptor.AddProviderTransparent(
        new AssociatedMetadataTypeTypeDescriptionProvider(
            typeof(MyClass), 
            typeof(MyClassMetaData)), 
            typeof(MyClass)
    );
}

在增加GUI的复杂性之前,您还可以尝试运行单元测试来确认Validator是否使用了您的注释:

代码语言:javascript
复制
[TestMethod]
public void TestAnnotations()
{
    MyClass c = new MyClass();

    // Manually validate the MyClass object
    List<ValidationResult> validationResults = new List<ValidationResult>();
    ValidationContext context = new ValidationContext(c, serviceProvider: null, items: null);
    bool isValid = Validator.TryValidateObject(c, context, validationResults, validateAllProperties: true);

    Assert.IsFalse(isValid, "Validation should fail because we didn't set SomeText");

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

https://stackoverflow.com/questions/45119827

复制
相关文章

相似问题

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