チェックボックス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(); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。