かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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);
        }
    }
}