参考:VS2012Ultimateで.NET4.5とSilverlight5を使用する。
[必須]および長さのデータ注釈が、Silverlightフォームに組み込まれて検証されることを望んでいません。私はDDSを介して公開されたかなり単純なクラスを持っています。例:
public class FooCard : INotifyPropertyChanged
{
[Key]
[Required]
[IntegerValidator(MinValue = 0, MaxValue = 32768)]
public short FooID { get; set; }
[Required]
[StringLength(15)]
public string FooName { get; set; }
私のXMALは次のようになります。
<TextBlock Height="25" Text="FooID:" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right"
Margin="0,0,2,0">
</TextBlock>
<TextBox Name="TextBox_FooID" Text="{Binding Path=FooID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1" TextChanged="TextBox_TextChanged">
</TextBox>
<TextBlock Height="25" Text="Foo Name:" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right"
Margin="0,0,2,0">
</TextBlock>
<TextBox Name="TextBox_FooName" Text="{Binding Path=FooName, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1"
TextChanged="TextBox_TextChanged"
LostFocus="TextBox_FooName_LostFocus">
DDSはfalseを自動ロードするように設定されており、クエリパラメータはFooIDテキストボックスにバインドされています。最初に、誰かがフォームをロードするときに、データコンテキストをDDSに設定しました。この場合、ユーザーが「New Foo」レコードを作成していることを選択したため、DDSでロード操作を実行しません。したがって、DataView.CurrentItemはこの時点ではnullです。これが起こっていることです:
ユーザーがFooIDなどの注釈を使用してバインドされたフィールドに何かを入力し始めると、そのフィールドでのみ注釈バリデーターがすぐに実行されます。最小の長さを示す赤いボックスが表示されます。しかし、私の例のFooNameのように、他のバインドされたプロパティを検証するものはありません。空のfooNameを使用して実際に変更を送信すると、検証エラーの例外がスローされます。もちろん、変更の保存ボタンをDDSのHasValidationErrorsプロパティにバインドして、これがユーザーに起こらないようにします。しかし、ユーザーは変更の保存ボタンが無効になっている理由について混乱しており、fooNameに何かを入力する必要のある赤いボックスはありません。もちろん、ラベルを作成するか、必要であることを示す*をボックスの横に配置することもできます。
しかし、FooName = "";をロードすることで、これを回避できます。FooName = string.empty; OnNavigatedToの分離コードで。スペースをロードしてから再び空の文字列に設定すると、赤いボックスが表示されます。これは、Silverlightが各プロパティを最初に初期化する必要があるようなものです。これは完全なハックのようで、フォーム上の50以上のテキストボックスをすべて偽の初期値に設定してから元に戻すことを要求するのは嫌です。すなわち。これは解決策ではなく、トラブルシューティングの手順です。
ここで何が起こっているのですか?私はまだかなり新しい開発者であり、生涯にわたるDBA(SLソリューションの開発はわずか1年)であり、コードビハインドやボタンクリックイベントなどでの貧弱な検証の代わりに、クラスでバリデーターを使い始めました。しかし、この種の問題が発生しているため、google/bingで多くの情報を見つけることができませんでした。任意の洞察をいただければ幸いです。私はおそらく何か間違った方向に進んでいると確信しています。