У меня есть два элемента управления TextBox (как показано ниже), и я хотел бы передать текст первого TextBox [x:Name="defPointFrom1Txt"
] в ValidationRule [MinIntegerValidationRule
] для второго TextBox [x:Name="defPointTo1Txt"
] вместо текущего значения 1. Я мог бы сделать это в коде путем присвоения имени правилу проверки и настройки на основе события, когда значение в первом текстовом поле изменяется. Однако есть ли способ сделать это в XAML, чтобы сохранить всю логику проверки в одном месте?
<TextBox x:Name="defPointFrom1Txt" Grid.Row="2" Grid.Column="1" Style="{StaticResource lsDefTextBox}"
Text="{Binding Path=OffensePointsAllowed[0].From}" IsEnabled="False"/>
<TextBox x:Name="defPointTo1Txt" Grid.Row="2" Grid.Column="2" Style="{StaticResource lsDefTextBox}"
LostFocus="defPointTo1Txt_LostFocus">
<TextBox.Text>
<Binding Path="OffensePointsAllowed[0].To" StringFormat="N1">
<Binding.ValidationRules>
<gui:MinIntegerValidationRule Min="1"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Мой код правила проверки приведен ниже для полноты картины.
public class IntegerValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
float controlValue;
try
{
controlValue = int.Parse(value.ToString());
}
catch (FormatException)
{
return new ValidationResult(false, "Value is not a valid integer.");
}
catch (OverflowException)
{
return new ValidationResult(false, "Value is too large or small.");
}
catch (ArgumentNullException)
{
return new ValidationResult(false, "Must contain a value.");
}
catch (Exception e)
{
return new ValidationResult(false, string.Format("{0}", e.Message));
}
return ValidationResult.ValidResult;
}
}
public class MinIntegerValidationRule : IntegerValidationRule
{
public int Min { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
ValidationResult retValue = base.Validate(value, cultureInfo);
if (retValue != ValidationResult.ValidResult)
{
return retValue;
}
else
{
float controlValue = int.Parse(value.ToString());
if (controlValue < Min)
{
return new ValidationResult(false, string.Format("Please enter a number greater than or equal to {0}.",Min));
}
else
{
return ValidationResult.ValidResult;
}
}
}
}
ОБНОВИТЬ:
В ответ на ответы ниже я пытаюсь создать DependencyObject. Я сделал это следующим образом, но не знаю, как использовать это в коде ValidationRule (или даже то, что я создал его правильно).
public abstract class MinDependencyObject : DependencyObject
{
public static readonly DependencyProperty MinProperty =
DependencyProperty.RegisterAttached(
"Min", typeof(int),
typeof(MinIntegerValidationRule),
new PropertyMetadata(),
new ValidateValueCallback(ValidateInt)
);
public int Min
{
get { return (int)GetValue(MinProperty); }
set { SetValue(MinProperty, value); }
}
private static bool ValidateInt(object value)
{
int test;
return (int.TryParse(value.ToString(),out test));
}
}
ValidateValueCallback
реализовано? - person DHN   schedule 19.03.2013ValidationRule
не наследуется отDependencyObject
. Следовательно, вы не можете установитьDependencyProperty
напрямую. Даже после созданияDependencyProperty
отдельно и помещения его в класс вы по-прежнему не можете использовать его для привязки. См. Ссылку в ответе ниже ... - person Harrison   schedule 19.03.2013