#wpf #checkbox #idataerrorinfo
#wpf #флажок #idataerrorinfo
Вопрос:
У меня есть три флажка, которые имеют собственную проверку ошибок относительно того, допустимы ли они, но я также хотел бы обеспечить, чтобы по крайней мере один из них был проверен перед продолжением. В настоящее время я использую IDataErrorInfo для индивидуальной проверки ошибок и попытался с помощью BindingGroups проверить, что хотя бы один флажок установлен, но безуспешно.
Вот XAML,
<StackPanel Orientation="Horizontal" Margin="5,2">
<Label Content="Checkboxes:" Width="100" HorizontalContentAlignment="Right"/>
<CheckBox Content="One" Margin="0,5">
<CheckBox.IsChecked>
<Binding Path="One" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<DataErrorValidationRule />
</Binding.ValidationRules>
</Binding>
</CheckBox.IsChecked>
</CheckBox>
<CheckBox Content="Two" Margin="5,5">
<CheckBox.IsChecked>
<Binding Path="Two" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<DataErrorValidationRule />
</Binding.ValidationRules>
</Binding>
</CheckBox.IsChecked>
</CheckBox>
<CheckBox Content="Three" Margin="0,5">
<CheckBox.IsChecked>
<Binding Path="Tree" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<DataErrorValidationRule />
</Binding.ValidationRules>
</Binding>
</CheckBox.IsChecked>
</CheckBox>
</StackPanel>
И код проверки ошибок, стоящий за
public string this[string property]
{
get {
string result = null;
switch (property) {
case "One":
{
if (One) {
if (CheckValid(One)) {
result = "Invalid Entry";
}
}
}
break;
case "Two":
{
if (Two) {
if (CheckValid(Two)) {
result = "Invalid entry";
}
}
}
break;
case "Three":
{
if (Three) {
if (CheckValid(Three)) {
result = "Invalid entry"
}
}
}
break;
}
return resu<
}
Есть предложения о том, как я могу заставить флажки отображать ошибку, если хотя бы один не установлен?
Ответ №1:
Чтобы сохранить существующий код, вы можете изменить свое правило проверки данных, чтобы проверять состояние всех трех флажков одновременно.
case "One":
{
if (One)
{
if (CheckValid(One))
{
result = "Invalid Entry";
}
}
else if (!CheckThreeValid(One, Two, Three))
{
result = "Invalid entry";
}
}
private static bool CheckThreeValid(bool one, bool two, bool three)
{
bool rc = true;
if ( !one amp;amp; !two amp;amp; !three )
{
return false;
}
return rc;
}
и уведомлять все три флажка при изменении одного значения, поэтому, когда вы снимаете последний флажок, а затем устанавливаете другой флажок, модель удаляет ошибку проверки.
public bool One
{
get { return one; }
set
{
one = value;
RaisePropertyChanged("One");
RaisePropertyChanged("Two");
RaisePropertyChanged("Three");
}
}