質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

Q&A

解決済

1回答

812閲覧

xaml データ検証時のエラーメッセージ

haruharu09

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

0グッド

0クリップ

投稿2018/08/03 06:39

編集2018/08/06 03:50

チェックボックスを押下時のデータ検証
今の状態は
1.チェックボックスいずれかを変更して、どれもチェックがされていないとTextBlockのErrorMessageTextの部分が赤枠で表示される。
2.他のチェックボックスがチェックがされていない状態で、CB5のチェックを外したときにのみしかエラーメッセージが表示されない。

したいことは
1.赤枠を消したい
2.どのチェックボックスでもチェックを外して他もチェックされていない場合はエラーとしメッセージが表示されるようにしたい
3.いずれかがチェックされた状態になった場合にエラーメッセージを消したい。

なにか良い解決策があれば教えていただきたいです。

足りない情報やもっと詳しくなどあればお願いします。

以上です。

<ListView x:Name="ListView" Grid.Column="0" Margin="10,5,10,5" ItemsSource="{Binding Source={StaticResource ItemCollection}}"> <ListView.View> <GridView> ・ ・ ・ ・ ・ ・ ・ ・ <GridViewColumn Width="200"> <HeaderedContentControl Name="hdrPrinterDistribution">チェックボックス</HeaderedContentControl> <GridViewColumn.CellTemplate> <DataTemplate> <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <StackPanel> <Label Content="CB1" /> <CheckBox HorizontalAlignment="Center" Validation.ValidationAdornerSite="{Binding ElementName=ErrorMessageText}" > <CheckBox.Resources> <proxy:BindingProxy x:Key="Item" Data="{Binding}"/> </CheckBox.Resources> <CheckBox.IsChecked> <Binding Path="CB1 " Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnExceptions="True"> <Binding.ValidationRules> <validation:CheckBoxCheckedRule ValidationStep="UpdatedValue"> <validation:CheckBoxValue Item="{Binding Data, Source={StaticResource Item}}" /> </validation:CheckBoxCheckedRule> </Binding.ValidationRules> </Binding> </CheckBox.IsChecked> </CheckBox> </StackPanel> 中略 <StackPanel Grid.Column="4"> <Label Content="CB5" /> <CheckBox HorizontalAlignment="Center" Validation.ValidationAdornerSite="{Binding ElementName=ErrorMessageText}" > <CheckBox.Resources> <proxy:BindingProxy x:Key="Ite" Data="{Binding}"/> </CheckBox.Resources> <CheckBox.IsChecked> <Binding Path="CB5 " Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnExceptions="True"> <Binding.ValidationRules> <validation:CheckBoxCheckedRule ValidationStep="UpdatedValue"> <validation:CheckBoxValue Item="{Binding Data, Source={StaticResource Item}}" /> </validation:CheckBoxCheckedRule> </Binding.ValidationRules> </Binding> </CheckBox.IsChecked> </CheckBox> </StackPanel>                        <StackPanel Grid.Row="2" HorizontalAlignment="Left" Grid.ColumnSpan="3"> <TextBlock Name="ErrorMessageText" Width="200" Text="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.ValidationAdornerSiteFor).(Validation.Errors)[0].ErrorContent}"/> </StackPanel> </Grid> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView>

上記の画面xamlはListViewでItemクラスのリストをObservableCollectionでnewしてバインドしています。

[ContentProperty("CheckBoxValue")] public class CheckBoxCheckedRule : ValidationRule { public CheckBoxValue CheckBoxValue { get; set; } public override ValidationResult Validate(object value, CultureInfo cultureInfo) { Item item = this.CheckBoxValue.Item; if (item == null) { return new ValidationResult(true, null); } if ((item.CB1.HasValue && item.CB1.Value) || (item.CB2.HasValue && item.CB2.Value) || (item.CB3.HasValue && item.CB3.Value) || (item.CB4.HasValue && item.CB4.Value) || (item.CB5.HasValue && item.CB5.Value) ) { return new ValidationResult(true, null); } return new ValidationResult(false, "Invalid input."); } } ・・・・・・・・・・・・・・・・・・・・・ public class CheckBoxValue : DependencyObject { public static readonly DependencyProperty ItemProperty = DependencyProperty.Register( nameof(Item), typeof(Item), typeof(CheckBoxValue), new PropertyMetadata(default(object))); public Item Item { get { return (Item)GetValue(ItemProperty); } set { SetValue(ItemProperty, value); } } }  ・・・・・・・・・・・・・・・・・・・・・・・・・・ public class Item { public bool? CB1 { get; set; } ・ ・ ・ ・ public bool? CB5 { get; set; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

csharp

1 if ((item.CB1.HasValue && item.CB1.Value) 2 || (item.CB2.HasValue && item.CB2.Value) 3 || (item.CB3.HasValue && item.CB3.Value) 4 || (item.CB4.HasValue && item.CB4.Value) 5 || (item.CB5.HasValue && item.CB5.Value) 6 ) 7 { 8 return new ValidationResult(true, null); 9 } 10

ここのif文、CB1から5の全部がnullだったらelseに分岐していまいます。
全部が!item.CB_.HasValueのとき、正常系になるようにorを足すか、CB1からCB5までをIEnumerable<bool?>につっこんで、AnyとAllで正常判定をするようにするか。


CB5のチェックボックスをチェックしてエラーとなった場合のみしかエラーメッセージが表示されない。

の現象なのですが、チェックをつける=エラー、でしょうか?

--- 追記
最初に赤くなってしまう問題。起動直後にnullなのだとしたら、↓こういう感じで、"値がない、または、値がればTrue(チェックあり)、のとき成功"というバリデーションルールにすればいいのではないかと思います。

csharp

1if ( (!item.CB1.HasValue || (item.CB1.HasValue && item.CB1.Value)) 2|| (!item.CB2.HasValue || (item.CB2.HasValue && item.CB2.Value))

チェックを外したときって、CBってnullですか?falseですか?

投稿2018/08/04 17:47

編集2018/08/06 13:19
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haruharu09

2018/08/06 00:52

回答ありがとうございます。 "他のチェックボックスがチェックがされていない状態で、CB5のチェックを外したときにのみ"です。 誤解させて申し訳ありません。 また、CB1~CB5が全てNullの場合はelseで問題ないです。 チェックボックスに触った結果いずれもチェックされていなければエラーとしたいので... このnullが問題であれば、別の方法を考えてみたいと思います。
papinianus

2018/08/06 13:22

いちおう追記しましたが、全てnullのときelse(すなわちエラー)となると、おそらく起動直後で触ってないときは、全部nullで赤い枠(エラーの囲み)が出ているのではないですか?という意味の回答でした。 全部nullがelse(すなわちエラー)が想定通りであれば、起動直後に赤い枠がつくのは仕方ないという話になってくる可能性があります。 初期状態ってnullなんでしょうか?もしくはチェックを外したときがnull?そもそもチェックボックスってチェックがあったらtrue/なければfalseなのに、bool?にしている必然性に理解が及びません。 (この後有益な回答・コメントをお出しできない可能性があります)
haruharu09

2018/08/07 00:48

いろいろ情報不足で申し訳ありません。 初期状態は CB1=True CB2=nullだったり不規則です。 全てがTrueまたはflase、nullいずれもありえる状態です。 起動直後(触っていない)の状態ですと赤枠はでていないです。 他もチェックされていない状態でCB1のチェックを外した場合、elseになっていることを確認しているのですが、赤枠のみでメッセージが表示されず、 CB5でバリデーションが動いたときにしかメッセージが表示されないのです。 バリデーションのルール的には想定内の動きをしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問