GroupBox を含むフォームがあり、その中にいくつかのコントロール (チェックボックス、テキストボックス、およびコンボボックス) があります。
フォームは、そのプロパティに IDataErrorInfo を実装するビュー モデルにバインドされ、ユーザーがコントロールに無効な値を入力すると、IDataInfo は無効な結果を返し、コントロールは通常の赤いボックスで囲まれ、エラー メッセージが表示されます。フォームの下部にあります。
つまり、GroupBox は一連の必須値を示すことを目的としています。ユーザーは、グループ内のチェックボックスを少なくとも 1 つオンにする必要があります。そうしないことは、個々のコントロールのエラーではなく、グループのエラーです。そこで、GroupBox に BindingGroup を追加し、何も選択されていない場合にエラーを返す ValidationRule を追加しました。そして、それはうまくいきます。何も選択されていない場合、GroupBox は通常の赤いボックスで囲まれ、フォームの下部にエラー メッセージが表示されます。
私の問題は、GroupBox 内のコントロールの 1 つが検証に失敗した場合、2 つの赤いボックス (コントロールの周りに 1 つ、GroupBox の周りに 1 つ) が表示されることです。そして、フォームの下部にあるリストに 2 つのエラー メッセージが表示されます。
BindingGroup がグループ内に含まれるすべてのエラーを報告しないようにするにはどうすればよいですか?
編集:
簡単な例 - これは Validation.Errors を表示しませんが、含まれている TextBox が失敗した場合、検証に失敗したとして StackPanel が強調表示されていることがわかります。
XAML:
<Window
x:Class="BugHunt5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BugHunt5"
Title="MainWindow"
Height="350"
Width="525"
>
<GroupBox
Margin="20"
Header="This is my group"
x:Name="MyGroupBox"
>
<StackPanel>
<StackPanel.BindingGroup>
<BindingGroup NotifyOnValidationError="True">
</BindingGroup>
</StackPanel.BindingGroup>
<TextBox
Height="30"
Width="100"
>
<TextBox.Text>
<Binding
NotifyOnValidationError="True"
ValidatesOnDataErrors="True"
Path="MyString"
UpdateSourceTrigger="PropertyChanged"
>
<Binding.ValidationRules>
<local:NoDecimalsValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>
</GroupBox>
</Window>
C#:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel("This should be an integer");
}
}
public class ViewModel
{
public string MyString
{ get; set; }
public ViewModel(string mystring)
{ this.MyString = mystring; }
}
public class NoDecimalsValidationRule : ValidationRule
{
public override ValidationResult Validate(object value,
System.Globalization.CultureInfo cultureInfo)
{
string myString = value as string;
int result;
if (!Int32.TryParse(myString, out result))
return new ValidationResult(false, "Must enter integer");
return new ValidationResult(true, null);
}
}