かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ReactivePropertyのErrorプロパティの意味?

IDataErrorInfoのErrorプロパティがあるのですが、動きがちぐはぐな気がしたのでメモ兼id:neueccさんへの連絡?
SetValidateAttributeとSetValidateErrorでエラーメッセージがErrorプロパティに表示されたりされなかったり。個人的にはSetValidateErrorの動きにSetValidateAttributeを合わせてほしいなぁと思ったり(チラッチラッ

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Codeplex.Reactive;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace RxPropTest
{
    [TestClass]
    public class ReactivePropertyTest
    {
        [TestMethod]
        public void NoErrorValidationTest_SetValidateAttribute()
        {
            var target = new Target();
            target.Name.Value = "sample";
            ((IDataErrorInfo)target.Name)["Value"].IsNull();
            target.Name.Error.IsNull();
        }

        [TestMethod]
        public void ErrorValidationTest_SetValidateAttribute()
        {
            var target = new Target();
            target.Name.Value = "";
            ((IDataErrorInfo)target.Name)["Value"].Is("ErrorMessage");
            target.Name.Error.Is("ErrorMessage"); // ここで失敗する
        }

        [TestMethod]
        public void NoErrorValidationTest_SetValidateError()
        {
            var target = new Target();
            target.Age.Value = 13;
            ((IDataErrorInfo)target.Age)["Value"].IsNull();
            target.Age.Error.IsNull();
        }

        [TestMethod]
        public void ErrorValidationTest_SetValidateError()
        {
            var target = new Target();
            target.Age.Value = -1;
            ((IDataErrorInfo)target.Age)["Value"].Is("ErrorMessage");
            target.Age.Error.Is("ErrorMessage");
        }
    }

    class Target
    {
        [Required(ErrorMessage = "ErrorMessage")]
        public ReactiveProperty<string> Name { get; private set; }

        public ReactiveProperty<int> Age { get; private set; }

        public Target()
        {
            this.Name = new ReactiveProperty<string>()
                .SetValidateAttribute(() => Name);

            this.Age = new ReactiveProperty<int>()
                .SetValidateError(i => i < 0 ? "ErrorMessage" : null);
        }
    }
}