我的Project Sample中有一个名为ContainsValidationRule的类。我在这个项目中有一个名为MainWindowViewModel的viewModel。代码看起来像:
namespace Sample
{
using System.Globalization;
using System.Linq;
using System.Windows.Controls;
public class ContainsValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var result = MainWindowViewModel.CurrentInstance.Items.Any(x => x.ToLower(cultureInfo).Contains((value as string).ToLower(cultureInfo)));
return new ValidationResult(result, "No Reason");
}
}
}
效果很好。但是,我没有将MainViewViewModel硬编码,而是将其作为参数传递给Validate Method。所以我也可以将这个类用于其他ViewModel。
如果有更好的解决方案,则将ViewModel名称作为参数传递,请描述。
答案 0 :(得分:1)
好吧,我必须说你的代码有点令人困惑。通常,您将使用该值作为您正在验证的内容。
例如:
<TextBox.Text>
<Binding Path="SomeProperty" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validations:YourValidationName ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
这样做,就是每当您更新文本框时,它都会对其进行验证,如果它无效,您将获得红色边框(或您设置的任何样式)和错误
另一方面,完全忽略您正在验证的对象,并使用硬编码的MainWindowViewModel.CurrentInstance.Items...
来检查...
简而言之,object value
是您的参数。
总之,我认为你应该阅读一些关于如何使用验证的内容,并修改你的逻辑和代码。