xaml で validationRules を呼び出す必要があり、viewmodel (datacontext にある) プロパティを引数として渡したいと思います。どうすればそれを達成できますか?
<Binding.ValidationRules>
<vm:RiskCodeValidation/>
</Binding.ValidationRules>
xaml で validationRules を呼び出す必要があり、viewmodel (datacontext にある) プロパティを引数として渡したいと思います。どうすればそれを達成できますか?
<Binding.ValidationRules>
<vm:RiskCodeValidation/>
</Binding.ValidationRules>
ValidationRule.ValidationStepをValidationStep.CommitedValueまたはValidationStep.UpdatedValueに設定すると、Validateメソッドの値パラメーターのタイプはBindingExpressionになり、BindingExpression.DataItemプロパティを使用してDataContextを取得できます。
残念ながら、バインディングソースが更新された後にのみ機能します。
次に例を示します。
public class RiskCodeValidation : ValidationRule
{
public RiskCodeValidation()
: base(ValidationStep.CommittedValue, true)
{
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var expression = value as BindingExpression;
if (expression != null)
{
var sourceItem = expression.DataItem;
if (sourceItem != null)
{
var propertyName = expression.ParentBinding != null && expression.ParentBinding.Path != null ? expression.ParentBinding.Path.Path : null;
var sourceValue = sourceItem.GetType().GetProperty(propertyName).GetValue(sourceItem, null);
// TODO: do validation logic based on sourceItem, propertyName and sourceValue.
}
}
return ValidationResult.ValidResult;
}
}
私は WPF ValidationRules の既知の制限に行きました。依存関係プロパティを ValidationRules のプロパティにバインドできません。この問題は、ここで説明され、解決されています (WPF の制限により、まだ見苦しい解決策です)。
http://michlg.wordpress.com/2010/01/29/wpf-custom-validationrule-with-an-additional-parameter/
http://www.codeproject.com/Articles/18678/Attaching-a-Virtual-Branch-to-the-Logical-Tree-in
http://www.11011.net/wpf-binding-properties
または、単純に System.ComponentModel.IDataErrorInfo を使用します。これを今すぐ実行します。