【问题标题】:passing a viewmodel class name as parameter to validate method of a class inheriting from ValidationRule class将 viewmodel 类名作为参数传递给从 ValidationRule 类继承的类的验证方法
【发布时间】:2013-10-28 20:22:56
【问题描述】:

我的项目示例中有一个名为 ContainsValidationRule 的类。我在这个项目中有一个名为 MainWindowViewModel 的视图模型。代码看起来像:

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

【问题讨论】:

  • 这篇文章 (stackoverflow.com/questions/4345606/…) 你可能会感兴趣。
  • ValidationRule 确实是验证事物的“旧”式方式。你应该看看INotifyDataErrorInfo
  • 我同意@Shoe,但我不得不承认...我无法弄清楚您在这里验证的具体内容...请您赐教吗?

标签: c# wpf mvvm


【解决方案1】:

好吧,我必须说你的代码有点令人困惑。通常您将使用该值作为您要验证的值。

例如:

<TextBox.Text>
 <Binding Path="SomeProperty" UpdateSourceTrigger="PropertyChanged">
     <Binding.ValidationRules>
         <validations:YourValidationName ValidatesOnTargetUpdated="True" />
     </Binding.ValidationRules>
 </Binding>
</TextBox.Text>

这会做什么,每当你更新你的文本框时,它会验证它,如果它无效,你会得到红色边框(或你设置的任何样式)和错误。

另一方面,完全忽略您正在验证的对象,并将使用硬编码的MainWindowViewModel.CurrentInstance.Items... 进行检查...

简而言之,object value 是您的参数。

总之,我认为您应该阅读一下如何使用验证,并修改您的逻辑和代码。

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多