传递viewmodel类名作为参数来验证从ValidationRule类继承的类的方法

时间:2013-10-28 20:22:56

标签: c# wpf mvvm

我的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名称作为参数传递,请描述。

1 个答案:

答案 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是您的参数。

总之,我认为你应该阅读一些关于如何使用验证的内容,并修改你的逻辑和代码。