Wpf 使用最基本的元数据类型

Wpf 使用最基本的元数据类型,wpf,metadata,prism,data-annotations,metadatatype,Wpf,Metadata,Prism,Data Annotations,Metadatatype,除了我原来的帖子之外,我想我还需要提到我正在使用Prism 6.3。显然,编译器不喜欢添加到元数据类中的内容不在原始部分中。不知道如何解决这个问题。 再次感谢。。。 好吧,我给你,叔叔 我正在尝试向我的wpf实体框架应用程序添加数据注释。我试过6种方法来庆祝周日,但都不走运。我把什么是我认为最简单的例子,并遵循所有的指令…什么都不管用。 来吧。 我有一个由EF生成的类(db-first) 我有另一个包含以下分部类的文件: namespace junk.DataModels { [Meta

除了我原来的帖子之外,我想我还需要提到我正在使用Prism 6.3。显然,编译器不喜欢添加到元数据类中的内容不在原始部分中。不知道如何解决这个问题。 再次感谢。。。

好吧,我给你,叔叔

我正在尝试向我的wpf实体框架应用程序添加数据注释。我试过6种方法来庆祝周日,但都不走运。我把什么是我认为最简单的例子,并遵循所有的指令…什么都不管用。 来吧。 我有一个由EF生成的类(db-first)

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

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中,我定义:

private MyClass _mc;
public MyClass MC
{
    get { return _mc; }
    set
    {
        SetProperty(ref _mc, value);
    }
}
在构造器中:

MC = new MC();
MC.SomeText = "Hello World.";
最后,在我的xaml中:

我有一个单绑定控件:

<TextBox x:Name="txt" Text="{Binding MC.SomeText, 
        ValidatesOnDataErrors=True, 
        ValidatesOnExceptions=True,
        ValidatesOnNotifyDataErrors=True,
        UpdateSourceTrigger=PropertyChanged }"
 />

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


任何帮助都会很好

尝试将以下静态构造函数添加到好友类“MyClass”中。它将针对您的EF类注册元数据,以便验证器可以找到数据注释:

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的复杂性之前,您还可以尝试运行单元测试以确认验证器是否使用了您的注释:

[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");

}
[TestMethod]
公开无效遗嘱说明()
{
MyClass c=新的MyClass();
//手动验证MyClass对象
列表验证结果=新列表();
ValidationContext=新的ValidationContext(c,serviceProvider:null,items:null);
bool isValid=Validator.TryValidateObject(c、上下文、validationResults、validateAllProperties:true);
IsFalse(isValid,“验证应该失败,因为我们没有设置SomeText”);
}
[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");

}