トップ回答者
文字列型以外の変数のデータ検証

質問
-
Hoshinaです
こんにちはC#2010を使用して,WPFの学習中です。
疑問が生じました。ご存じの方や意見がお有りの方がありましたら,ご教授ください。文字列型以外,例えばdouble型の変数をもつModelViewを定義します。
画面には,TextBoxを用意して,double型の変数をバインドします。このとき,doubleとみなせる入力の場合は,ModelViewの該当するデータ検証処理が呼び出されますが,英文字を入力した場合はTextBoxの枠が自動的に赤くなり,ModelViewのデータ検証処理が呼び出されません。
私は,入力値がすべて整合しているかどうかを,ModelViewで一元管理したいと思っていますが,デフォルトではModelViewとViewにエラーの情報が分散されてしまいます。
①ModelViewで一元管理するのは,よくない
②標準で,ModelViewで一元管理できる方法がある(私が知らないだけ)
③標準的な方法が別にある皆さんは,どのようにされているでしょうか?
回答
-
標準的かどうかは判りませんが、プロパティの型を 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
-
数値型を普通にバインドして、数値以外が入力されたら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
すべての返信
-
標準的かどうかは判りませんが、プロパティの型を 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
-
Hoshinaです
こんにちはたびたび投稿ありがとうございます。
私の考えも,さほど的外れではないようですね。
目下のところ,以下のようにして,検証中です。①Modelを定義する
②ModelViewを定義し,Modelのインスタンスを変数に持つ
③文字列型以外の変数は,ModelViewに文字列で別の変数を定義する
④全てのデータ検証をModelViewで実施する
⑤検証結果をModelViewで一元管理し,IsValid()メソッドを提供する
⑥検証をパスしたデータは,ModelViewが持つ,Model変数で管理するこの⑥ですが,ModelViewとModelとの関連を自動的に行ってくれる仕組みは,自前で用意するしかないとの理解で良いでしょうか?
とりあえずは,このようなアプローチでどこまでいけそうか試しています。
-
ModelView ではなく ViewModel ですね。(^^;
> この⑥ですが,ModelViewとModelとの関連を自動的に行ってくれる仕組みは,自前で用意するしかないとの理解で良いでしょうか?
そうです。
ただし一部の MVVM ツールには M と VM の関連を管理する仕組みが用意されていて、メモリリーク等の問題に対処するために WeakEvent パターンを使った管理機能が提供されてるようです。別のスレで言及した Livet にも、ViewModel~Model 間のイベントを管理する機能が用意されてます。ただしこの機能の具体的な使い方は現時点私もよく判りません。
関連記事:MVVMパターンの常識 ― 「M」「V」「VM」の役割とは?
ひらぽん http://d.hatena.ne.jp/hilapon/ -
ModelView ではなく ViewModel ですね。(^^;
失礼しました。編集しないで,このまま残しておきたいと思います。
また,情報ありがとうございました。
正直なところ,MVVMに忠実に準拠するのは,面倒だなと思っています。
もう少し,いろいろ試してみます。
質問の性質上,まだしばらくこのままにしておくつもりです。
個人的な理由から,来週後半までコメントできないと思います。
来週になって,「回答としてマーク」を付けたいと思いますが,「回答」よりも「参考」の意味合いが強いとおもっておりますので,ご意見をおもちの方はふるって投稿ください。それでは
-
数値型を普通にバインドして、数値以外が入力されたら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