チェックボックスを押下時のデータ検証
今の状態は
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; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/06 00:52
2018/08/06 13:22
2018/08/07 00:48