让最基本的MetaDataType工作

时间:2017-07-15 15:27:20

标签: wpf metadata prism data-annotations metadatatype

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

好的,我给,UNCLE!

我正在尝试将数据注释添加到我的wpf实体框架应用程序中。我已经尝试了6种方式来避免周日没有运气。我把我认为最简单的例子放在一起,并按照所有指示......没有用。 开始。 我有一个由EF(db first)生成的类。

namespace junk.DataModels
{
    public partial class MyClass
    {
        public string SomeText { get; set; }
    }
}

我有另一个文件,其中包含以下部分类:

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它可以工作,但这有点打败了目的。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

尝试将以下静态构造函数添加到您的好友类&#34; MyClass&#34;。它将针对您的EF类注册元数据,以便Validator可以找到数据注释:

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是否使用了您的注释:

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

}