0

私のプロジェクト サンプルには、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 メソッドに渡したいと思います。したがって、このクラスを他の ViewModel にも使用できます。

ViewModel名をパラメータとして渡すより良い解決策がある場合は、説明してください。

4

1 に答える 1

1

さて、あなたのコードは少し当惑していると言わざるを得ません。通常、検証対象として値を使用します。

例えば:

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

これにより、テキストボックスを更新するたびに検証され、無効な場合は赤い枠線 (または設定したスタイル) とエラーが表示されます。

一方、検証対象のオブジェクトを完全に無視し、ハードコードされた を使用しMainWindowViewModel.CurrentInstance.Items...てチェックします...

要するに、object valueあなたのパラメータです。

要するに、バリデーションの使い方を読んで、ロジックとコードを修正する必要があると思います。

于 2013-10-29T07:14:52.157 に答える