私はGroupBoxを持つフォームを持っており、その中にいくつかのコントロール(チェックボックス、テキストボックス、およびコンボボックス)があります。WPF/XAML - 検証エラーが2回表示される
IDataErrorInfoプロパティを実装するビューモデルにフォームがバインドされています。ユーザーが無効な値をコントロールに入力すると、IDataInfoは無効な結果を返し、コントロールは通常の赤いボックスで囲まれます。エラーメッセージがフォームの下部に表示されます。
問題は、GroupBoxは必須の値のセットを示すことを意図していることです。ユーザは、グループ内のチェックボックスの少なくとも1つをチェックする必要があります。そうしないと、個々のコントロールでエラーになることはありません。グループにはエラーがあります。そこでGroupBoxにBindingGroupを追加し、何も選択されていなければエラーを返すValidationRuleを追加しました。そしてそれはうまく動作します。何も選択されていない場合、GroupBoxは通常の赤いボックスで囲まれ、フォームの下部にエラーメッセージが表示されます。
私の問題は、GroupBoxのコントロールの1つが検証に失敗すると、コントロールの周りに1つ、GroupBoxの周りに1つの赤いボックスが2つあることです。フォームの下部にあるリストに2つのエラーメッセージが表示されます。
グループに含まれるすべてのエラーをBindingGroupが報告しないようにするにはどうすればよいですか?
EDITED:
簡単な例 - これはValidation.Errorsは表示されませんが、あなたは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);
}
}
関連するxamlとコードを追加できますか? –