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

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

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

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

XAML

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

Q&A

解決済

1回答

2350閲覧

BindingGroupのValidationについて

haruharu09

総合スコア10

C#

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

XAML

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

0グッド

1クリップ

投稿2018/08/02 03:56

編集2018/08/02 09:21

チェックボックス1~5があり、いずれかのチェックボックスが更新されたタイミングでCheckBoxRuleというValidationRuleを適用させ、いずれもチェックされていなければエラーとしたい。
のですが、いまいち方法がわかりません。
現在はページを上下させるとCheckBoxRuleに入ってきて赤枠が表示されているだけで、
チェックボックスをチェックしてCheckBoxRuleがTrueとなっていてもデバッグしていないと赤枠が残ったままです。

ページ上下のタイミングではなくチェックボックスがチェックされたときに、そのルールを適用させるやり方が知りたいです。

表示するメッセージをGridで囲まれている付近に出せればと思っています。

<GridViewColumn Width="200"> <HeaderedContentControl Name="hdrCheckBox">チェックボックス</HeaderedContentControl> <GridViewColumn.CellTemplate> <DataTemplate> <Grid> <Grid.RowDefinitions> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.BindingGroup> <BindingGroup Name="CheckBoxBindingGroup"> <BindingGroup.ValidationRules> <validation:CheckBoxIsCheckedRule ValidationStep="ConvertedProposedValue" ValidatesOnTargetUpdated="True"/> </BindingGroup.ValidationRules> </BindingGroup> </Grid.BindingGroup> <StackPanel> <Label Content="CB1" /> <CheckBox HorizontalAlignment="Center" IsChecked="{Binding CB1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, BindingGroupName=CheckBoxBindingGroup}" /> </StackPanel> <StackPanel Grid.Column="1"> <Label Content="CB2" /> <CheckBox HorizontalAlignment="Center" IsChecked="{Binding CB2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, BindingGroupName=CheckBoxBindingGroup}" /> </StackPanel> <StackPanel Grid.Column="2"> <Label Content="CB3" /> <CheckBox HorizontalAlignment="Center" IsChecked="{Binding CB3, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, BindingGroupName=CheckBoxBindingGroup}" /> </StackPanel> <StackPanel Grid.Column="3"> <Label Content="CB4" /> <CheckBox HorizontalAlignment="Center" IsChecked="{Binding CB4, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, BindingGroupName=CheckBoxBindingGroup}" /> </StackPanel> <StackPanel Grid.Column="4"> <Label Content="CB5" /> <CheckBox HorizontalAlignment="Center" IsChecked="{Binding CB5, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, BindingGroupName=CheckBoxBindingGroup}" /> </StackPanel> </Grid> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn>

上記の画面xamlはListViewで以下のアイテムのリストをObservableCollectionでnewしてバインドしています。

public class Item { public bool? CB1 { get; set; } ・ ・ ・ ・ public bool? CB5 { get; set; } }
public class CheckBoxRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var binding = value as BindingGroup; if (binding == null) { return new ValidationResult(true, null); } var item = binding.Items[0] as Item; if (item == null) { return new ValidationResult(true, null); } if ( (item.CB1.HasValue && item.CB1.Value)          ・          ・          ・ || (item.CB5.HasValue && item.CB5.Value) ) { return new ValidationResult(true, null); } return new ValidationResult(false, "Invalid input."); } }

足りない情報などありましたら提示します。
以上、よろしくお願いします。

////// 追記
以下のスタイルを適用することでメッセージが表示されるようになりましたが、
そのGrid部分にカーソルを当てないとメッセージが表示されず、おまけに離れたところで表示され、少ししたら消えてしまいます。
これを固定してエラーが解除されない限り表示して、Grid付近で表示位置を固定したいです。

<Style x:Key="GridHasErrorStyle" TargetType="{x:Type Grid}"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/> </Trigger> </Style.Triggers> </Style>

CheckBoxにクリックイベントを付加して以下で期待している結果となりますが、
できるだけクリックイベントをやめたいです。

<BindingGroup Name="CheckBoxBindingGroup"> <BindingGroup.ValidationRules> <validation:CheckBoxIsCheckedRule/> </BindingGroup.ValidationRules> </BindingGroup> private void CheckBox_Click(object sender, RoutedEventArgs e) { var checkBox = sender as CheckBox; checkBox.BindingGroup.UpdateSources(); }

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

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

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

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

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

guest

回答1

0

自己解決

何となく解決しました

投稿2018/08/03 03:56

haruharu09

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問