前提・実現したいこと
チェックボックスのIsCheckedとIsEnabledの値をBindingで指定しつつ、
INotifyDataErrorInfoで入力値のバリデーションを行いたいです。
特に、起動時にバリデーションエラーの状態で開始したいです。
発生している問題・エラーメッセージ
後述のソースコードは、
チェックボックスをONにするとバリデーションエラーが解除される
という挙動を想定しています。
(ただし、起動時のチェックボックスはOFF)
しかし、後述のソースコードを実行しますと、
チェックボックスをONにしてもバリデーションエラーが解除されません。
どうしてこのような挙動になってしまうのでしょうか。
該当のソースコード
MainWindowのコードビハインド側は手を加えていません。
C#
1using System; 2using System.Collections; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.Diagnostics; 6using System.Text; 7 8namespace NetCoreTest2 9{ 10 public class ViewModel 11 : INotifyDataErrorInfo 12 { 13 //起動時のチェックボックス 14 bool _Checked = false; 15 public bool Checked 16 { 17 get => _Checked; 18 set 19 { 20 _Checked = value; 21 if (!HasErrors) return; 22 ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs("Checked")); 23 } 24 } 25 public bool Enabled { get; } = true; 26 27 28 public bool HasErrors { 29 get => _Checked == false; 30 } 31 32 public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; 33 34 public IEnumerable GetErrors(string propertyName) 35 { 36 if (HasErrors) return new String[] { "error" }; 37 return null; 38 } 39 } 40}
xaml
1<Window x:Class="NetCoreTest2.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:NetCoreTest2" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Window.DataContext> 10 <local:ViewModel/> 11 </Window.DataContext> 12 <StackPanel Orientation="Vertical"> 13 <Border BorderThickness="5" Name="border"> 14 <CheckBox IsChecked="{Binding Checked}" IsEnabled="{Binding Enabled}" Content="チェックボックス"/> 15 </Border> 16 </StackPanel> 17</Window>
試したこと
- bool _Checked = true;(起動時のチェックボックスをON)で起動しますと、想定した挙動をします。
- IsEnabled="{Binding Enabled}"を削除しますと、bool _Checked = false;でも想定した挙動をします。
また、チェックボックスOFF開始の状態で
ライブプロパティエクスプローラーで確認しますと、
なぜかバリデーションエラーが2つ発生し、
その内1つのエラーが残り続けているようです。
補足情報(FW/ツールのバージョンなど)
.Net Core 3.0
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー