我有两个TextBox控件(如下所示),并希望将第一个TextBox [x:Name="defPointFrom1Txt"
]的Text传递给ValidationRule [MinIntegerValidationRule
],用于第二个TextBox [x:Name="defPointTo1Txt"
而不是当前值1.我可以在代码中通过命名验证规则并在第一个TextBox中的值更改时基于事件进行设置来执行此操作。但是,有没有办法在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));
}
}
答案 0 :(得分:1)
您无法在Min属性上设置绑定,因为它不是dependencyproperty。我以前做的是在viewmodel上创建一个验证属性属性,它给我类实例对象,然后我根据它执行验证。
在你的情况下,我会创建Min作为依赖对象。
答案 1 :(得分:0)
如果您考虑Binding
,那么您将不得不实现相对巨大的开销来使用它,因为您的验证类已经从另一个类继承。问题是使用Binding
绑定目标必须是DependencyProperty
(正如您可以阅读here),您无法直接在验证类中实现。
所以你可以创建例如验证类为AttachedProperty
,以便您可以使用Binding
。您可以找到一些信息here。
答案 2 :(得分:0)
这篇文章Attaching a Virtual Branch to the Logical Tree in WPF 作者Josh Smith于2007年5月6日概述了这个问题的解决方案。