none
文字列型以外の変数のデータ検証 RRS feed

  • 質問

  • Hoshinaです
    こんにちは

    C#2010を使用して,WPFの学習中です。
    疑問が生じました。ご存じの方や意見がお有りの方がありましたら,ご教授ください。

    文字列型以外,例えばdouble型の変数をもつModelViewを定義します。
    画面には,TextBoxを用意して,double型の変数をバインドします。

    このとき,doubleとみなせる入力の場合は,ModelViewの該当するデータ検証処理が呼び出されますが,英文字を入力した場合はTextBoxの枠が自動的に赤くなり,ModelViewのデータ検証処理が呼び出されません。

    私は,入力値がすべて整合しているかどうかを,ModelViewで一元管理したいと思っていますが,デフォルトではModelViewとViewにエラーの情報が分散されてしまいます。

    ①ModelViewで一元管理するのは,よくない
    ②標準で,ModelViewで一元管理できる方法がある(私が知らないだけ)
    ③標準的な方法が別にある

    皆さんは,どのようにされているでしょうか?

    2011年11月25日 5:13

回答

  • 標準的かどうかは判りませんが、プロパティの型を Object 型にして、検証処理を ViewModel で一元管理してもいいかも知れません。

    #Region "Value変更通知プロパティ"
        Private _Value As Object
    
        Public Property Value() As Object
            Get
                Return _Value
            End Get
            Set(ByVal value As Object)
                _errors("Value") = Nothing
    
                _Value = value
                If (_Value Is Nothing OrElse  String.IsNullOrEmpty(_Value.ToString()) Then
                    _errors("Value") = "値が空です。"
                ElseIf Not IsNumeric(_Value.ToString()) Then
                    _errors("Value") = "数値ではありません。"
                End If
                RaisePropertyChanged("Value")
            End Set
        End Property
    #End Region
    

    # VB ですみませんが・・・


    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答としてマーク Hoshina 2011年11月30日 23:57
    2011年11月25日 6:12
    モデレータ
  • 数値型を普通にバインドして、数値以外が入力されたらConverterで0にしてしまうのも手だと思います。動作に好みが出そうですが、通常は数値を入力することがほとんどだと思いますので、割り切れば開発工数を減らすことができ、シンプルに実装できます。

    (参考)
    WPF databinding binding error notification
    http://stackoverflow.com/questions/966430/wpf-databinding-binding-error-notification

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Hoshina 2011年11月30日 23:57
    2011年11月26日 13:28
    モデレータ

すべての返信

  • 標準的かどうかは判りませんが、プロパティの型を Object 型にして、検証処理を ViewModel で一元管理してもいいかも知れません。

    #Region "Value変更通知プロパティ"
        Private _Value As Object
    
        Public Property Value() As Object
            Get
                Return _Value
            End Get
            Set(ByVal value As Object)
                _errors("Value") = Nothing
    
                _Value = value
                If (_Value Is Nothing OrElse  String.IsNullOrEmpty(_Value.ToString()) Then
                    _errors("Value") = "値が空です。"
                ElseIf Not IsNumeric(_Value.ToString()) Then
                    _errors("Value") = "数値ではありません。"
                End If
                RaisePropertyChanged("Value")
            End Set
        End Property
    #End Region
    

    # VB ですみませんが・・・


    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答としてマーク Hoshina 2011年11月30日 23:57
    2011年11月25日 6:12
    モデレータ
  • Hoshinaです
    こんにちは

    たびたび投稿ありがとうございます。
    私の考えも,さほど的外れではないようですね。
    目下のところ,以下のようにして,検証中です。

    ①Modelを定義する
    ②ModelViewを定義し,Modelのインスタンスを変数に持つ
    ③文字列型以外の変数は,ModelViewに文字列で別の変数を定義する
    ④全てのデータ検証をModelViewで実施する
    ⑤検証結果をModelViewで一元管理し,IsValid()メソッドを提供する
    ⑥検証をパスしたデータは,ModelViewが持つ,Model変数で管理する

    この⑥ですが,ModelViewとModelとの関連を自動的に行ってくれる仕組みは,自前で用意するしかないとの理解で良いでしょうか?

    とりあえずは,このようなアプローチでどこまでいけそうか試しています。

    2011年11月25日 6:31
  • ModelView ではなく ViewModel ですね。(^^;

    > この⑥ですが,ModelViewとModelとの関連を自動的に行ってくれる仕組みは,自前で用意するしかないとの理解で良いでしょうか?

    そうです。

    ただし一部の MVVM ツールには M と VM の関連を管理する仕組みが用意されていて、メモリリーク等の問題に対処するために WeakEvent パターンを使った管理機能が提供されてるようです。別のスレで言及した Livet にも、ViewModel~Model 間のイベントを管理する機能が用意されてます。ただしこの機能の具体的な使い方は現時点私もよく判りません。

    関連記事:MVVMパターンの常識 ― 「M」「V」「VM」の役割とは?


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2011年11月25日 7:15
    モデレータ
  • ModelView ではなく ViewModel ですね。(^^;

    失礼しました。編集しないで,このまま残しておきたいと思います。

    また,情報ありがとうございました。

    正直なところ,MVVMに忠実に準拠するのは,面倒だなと思っています。
    もう少し,いろいろ試してみます。
    質問の性質上,まだしばらくこのままにしておくつもりです。
    個人的な理由から,来週後半までコメントできないと思います。
    来週になって,「回答としてマーク」を付けたいと思いますが,「回答」よりも「参考」の意味合いが強いとおもっておりますので,ご意見をおもちの方はふるって投稿ください。

    それでは

    2011年11月25日 7:34
  • 数値型を普通にバインドして、数値以外が入力されたらConverterで0にしてしまうのも手だと思います。動作に好みが出そうですが、通常は数値を入力することがほとんどだと思いますので、割り切れば開発工数を減らすことができ、シンプルに実装できます。

    (参考)
    WPF databinding binding error notification
    http://stackoverflow.com/questions/966430/wpf-databinding-binding-error-notification

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Hoshina 2011年11月30日 23:57
    2011年11月26日 13:28
    モデレータ
  • Hoshinaです
    こんにちは

    ひらぽんさん,trapemiyaさん情報ありがとうございます。
    もうすこし,自分なりに調べてみたいとおもいます。
    WPFはややネット上の情報が少ないようですね。

    とりあえず,(この言葉も変ですが)お二人の投稿に回答のマークを付けたいと思います。
    それでは

    2011年11月30日 23:57