かずきのBlog@hatena

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

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

とりあえず一安心。