かずきのBlog@hatena

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

ReactiveProperty v0.4.1.0をリリースしました

NuGetからさくっとインストールできるはずです。

変わった点の説明

ReactivePropertyには、値の検証を行う方法がいくつかります。

  • SetValidateNotifyErrorメソッドでラムダ式内で値の検証ロジックを書く方法
  • SetValidateAttributeメソッドでSystem.ComponentModel.DataAnnotationsの属性べーうでの検証を行うようにする方法

PCLに移植する前のReactivePropertyでは、最初のメソッドがINotifyDataErrorInfo、2つ目のメソッドをIDataErrorInfoで管理していました(と思います)。PCLにはIDataErrorInfoが無くてINotifyDataErrorInfoに一本化されたため、ReactivePropertyをPCLにするタイミングで、両方ともそっちに寄せました。

できなくなってたこと

管理場所が別だったのでSetValidateNotifyErrorとSetValidateAttributeを両方呼ぶことで属性での検証+ラムダ式での検証を両方走らせることが出来てましたが、一本化してしまったため、両方を同時に指定することができなくなってました…。あとからSetした検証方法のみ実行されるようになってました。

対処するための追加したメソッド

これまでの、SetValidateNotifyErrorメソッドとSetValidateAttributeメソッドに加えて、AddValidateNotifyErrorメソッドとAddValidateAttributeメソッドを追加して、1つのReactivePropertyに対して複数の検証方法を追加できるようにしました。

public class ValidationViewModel
{
    [StringLength(5, ErrorMessage = "Length < 5")]
    public ReactiveProperty<string> ValidationBoth { get; private set; }

    public ValidationViewModel()
    {
        // SetValidateAttributeに、AddValidateNotifyErrorでラムダ式での検証ロジックを追加
        ValidationBoth = new ReactiveProperty<string>()
            .SetValidateAttribute(() => ValidationBoth)
            .AddValidateNotifyError((string s) => string.IsNullOrEmpty(s) ? 
                "required" : 
                s.Cast<char>().All(Char.IsLower) ? 
                    null : 
                    "not all lowercase");
    }
}

とりあえず一安心。