我是WPF的新手,并且在绑定集合的验证方面存在问题。
我有DataGrid,它被限制在一起组合在一起的多态对象的集合。
DataGrid有两列:
DataGrid的每一行都绑定到基类中的一个对象。每个派生类都有自己的验证方法,我试图根据派生类的实例为TextBox执行适当的验证方法。
我可以基于ExceptionValidationRule绑定验证,但性能不是很好,应用程序闪烁,因为它有很多例外。我也知道我可以这样做抛出TextBox LostFocus的事件并获取源对象,但是如果可能的话,我试图对有界对象使用WPF验证。
我尝试在基类中继承ValidationRule并传递它,但它是用函数的基类输入而不是从派生的有界项输入 我试图创建实现ValidationRule和DependencyObject的单独类,我试图将源对象传递给它,如下所述:http://dedjo.blogspot.com/2007/05/fully-binded-validation-by-using.html
但我仍然无法让它发挥作用。为简单起见,我创建了一个具有TestString属性的DependencyObject,并尝试将其绑定到Display Name(Label的有界路径)。但是从不调用TestString的集合。
我该怎么做?如何调用相应的验证方法?我可以以某种方式将有界对象传递给Valuator吗?
感谢您的帮助, 沙立
我使用的代码:
DependencyObject的实现类:
class ManifestPropertyDependency : DependencyObject
{
private ManifestProperty _manifestPropertyInstance;
public ManifestProperty ManifestPropertyInstance
{
get { return (ManifestProperty)GetValue(ManifestPropertyInstanceProp); }
set
{
SetValue(ManifestPropertyInstanceProp, value);
}
}
private string testString;
public string TestString {
get { return (string)GetValue(TestStringProp); }
set { SetValue(TestStringProp, value); }
}
public ManifestPropertyDependency()
{
testString = "";
_manifestPropertyInstance = new ManifestProperty();
}
public static readonly DependencyProperty ManifestPropertyInstanceProp =
DependencyProperty.Register("ManifestPropertyInstance", typeof(ManifestProperty),
typeof(ManifestPropertyDependency), new UIPropertyMetadata(new ManifestProperty()));
public static readonly DependencyProperty TestStringProp =
DependencyProperty.Register("TestString", typeof(string),
typeof(ManifestPropertyDependency), new UIPropertyMetadata(""));
}
ValidationRule的实现类:
class ManifestPropertyValidator : ValidationRule
{
private ManifestProperty _manifest;
private ManifestPropertyDependency _manifestPropertyDependency;
public string Stam { get { return _manifestPropertyDependency.TestString; } set { _manifestPropertyDependency.TestString = value; } }
public ManifestPropertyDependency ManifestPropertyDependency
{
get { return _manifestPropertyDependency; }
set
{
_manifestPropertyDependency = value;
Stam = value.TestString;
_manifest = value.ManifestPropertyInstance;
}
}
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
try
{
string errorMessage = "";
if (ManifestPropertyDependency.ManifestPropertyInstance.ValidateString((string)value, ref errorMessage))
{
return new ValidationResult(true, null);
}
return new ValidationResult(false, errorMessage);
}
catch (Exception e)
{
return new ValidationResult(false, "Illegal characters or " + e.Message);
}
}
}
验证的Xaml:
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}"
Style="{StaticResource textStyleTextBox}">
<TextBox.Text>
<Binding Path="Value" Mode="TwoWay"
UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<Classes:ManifestPropertyValidator>
<Classes:ManifestPropertyValidator.ManifestPropertyDependency>
<Classes:ManifestPropertyDependency TestString="{Binding Path=DisplayName}"/>
</Classes:ManifestPropertyValidator.ManifestPropertyDependency>
</Classes:ManifestPropertyValidator>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
答案 0 :(得分:0)
老实说,我无法取消你的代码,但是看看你的要求,我发现这只是IDataErrorInfo
接口的候选者。
为什么不使用它呢?
你还谈到了验证的缓慢性。你能详细说明吗?你的模板慢吗?你的验证逻辑是否缓慢?或者你认为验证通知本身很慢?