我有一個自定義ValidationRule,它需要訪問ViewModel以驗證提供的值與ViewModel的其他屬性。我以前試圖通過使用ValidationGroup來實現這一點,但放棄了這個想法,因爲我修改的代碼需要大量的重構才能啓用此路由。將DataContext綁定到ValidationRule
我找到了一個thread on a newsgroup,它顯示了一種通過從DependencyObject繼承的中間類的方式將ValidationRule正在運行的控件的DataContext綁定到該ValidationRule的方法,但是我無法獲得它的綁定。
任何人都可以幫忙嗎?
我的有效性規則如下:...
class TotalQuantityValidator : CustomValidationRule {
public TotalQuantityValidator()
: base(@"The total number must be between 1 and 255.") {
}
public TotalQuantityValidatorContext Context { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo) {
ValidationResult validationResult = ValidationResult.ValidResult;
if (this.Context != null && this.Context.ViewModel != null) {
int total = ...
if (total <= 0 || total > 255) {
validationResult = new ValidationResult(false, this.ErrorMessage);
}
}
return validationResult;
}
}
CustomValidationRule定義如下......
public abstract class CustomValidationRule : ValidationRule {
protected CustomValidationRule(string defaultErrorMessage) {
this.ErrorMessage = defaultErrorMessage;
}
public string ErrorMessage { get; set; }
}
TotalQuantityValidatorContext定義如下......
public class TotalQuantityValidatorContext : DependencyObject {
public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register(@"ViewModel",
typeof(MyViewModel), typeof(TotalQuantityValidatorContext),
new PropertyMetadata {
DefaultValue = null,
PropertyChangedCallback = new PropertyChangedCallback(TotalQuantityValidatorContext.ViewModelPropertyChanged)
});
public MyViewModel ViewModel {
get { return (MyViewModel)this.GetValue(TotalQuantityValidatorContext.ViewModelProperty); }
set { this.SetValue(TotalQuantityValidatorContext.ViewModelProperty, value); }
}
private static void ViewModelPropertyChanged(DependencyObject element, DependencyPropertyChangedEventArgs args) {
}
}
而且整個事情因此被使用...
<UserControl x:Class="..."
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:val="clr-namespace:Validators" x:Name="myUserControl">
<TextBox Name="myTextBox">
<TextBox.Text>
<Binding NotifyOnValidationError="True" Path="myViewModelProperty" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<val:TotalQuantityValidator>
<val:TotalQuantityValidator.Context>
<val:TotalQuantityValidatorContext ViewModel="{Binding ElementName=myUserControl, Path=DataContext}" />
</val:TotalQuantityValidator.Context>
</val:TotalQuantityValidator>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</UserControl>
UserControl的DataContext正在代碼隱藏中設置爲MyViewModel的實例。我知道這個綁定工作,因爲標準的控制綁定正在按預期運行。
的TotalQuantityValidator.Validate
方法正確調用,但每當我看Context
的ViewModel
財產,它總是空(在TotalQuantityValidator
的Context
屬性被設置爲TotalQuantityValidatorContext
實例正確)。然而,我可以從調試器看到,TotalQuantityValidatorContext
的ViewModel
屬性上的setter從未被調用過。
有人可以告訴我如何讓這個綁定工作?
在此先感謝。
我知道這個問題是相似http://stackoverflow.com/questions/3577899/wpf-property-in-validationrule-never-set,但我期待訪問DataContext,而不僅僅是它的另一個屬性。 – 2010-12-03 13:05:29