2012-02-07 33 views
1

在其綁定到數據源的ItemsControl,我想使用自定義的驗證規則,它接受一個參數來驗證TextBox,以下是該vaildation規則的代碼。自定義驗證規則WPF和項目控制

public class RatioValidation : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     if (!String.IsNullOrEmpty(Maturity.MaturityValue) && Helper.IsDateInCorrectFormat(Maturity.MaturityValue)) 
     { 
      String strVal = Convert.ToString(value); 
      Double ratio = 0; 
      Boolean isValid = Double.TryParse(strVal, out ratio); 
      if (isValid) 
      { 
       if (ratio <= 0) 
        return new ValidationResult(false, "Please enter a valid ratio!"); 
       else return new ValidationResult(true, null); 
      } 
      return new ValidationResult(false, "Please enter a valid ratio!"); 
     } 
     else return new ValidationResult(true, null);   
    } 

    private MaturityDependencyForValidation _maturity; 
    public MaturityDependencyForValidation Maturity 
    { 
     get { return _maturity; } 
     set { _maturity = value; } 
    } 
} 

public class MaturityDependencyForValidation : DependencyObject 
{ 
    public String MaturityValue 
    { 
     get { return (String)GetValue(MaturityValueProperty); } 
     set { SetValue(MaturityValueProperty, value); } 
    } 

    public static readonly DependencyProperty MaturityValueProperty = 
     DependencyProperty.Register("MaturityValue", typeof(String), typeof(MaturityDependencyForValidation), new UIPropertyMetadata(null)); 

} 

,然後用它像下面,

<TextBox Grid.Row="1" Grid.Column="2" Name="txtRatio" BorderThickness="0" Width="148" Tag="{Binding StrMaturity, UpdateSourceTrigger=PropertyChanged}"> 
    <TextBox.Text> 
     <Binding Path="Ratio" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <leg:RatioValidation ValidatesOnTargetUpdated="True"> 
        <leg:RatioValidation.Maturity> 
         <leg:MaturityDependencyForValidation MaturityValue="{Binding txtMaturity}"/> 
        </leg:RatioValidation.Maturity> 
       </leg:RatioValidation> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

我得到在輸出窗口的異常:

找不到理事FrameworkElement的或FrameworkContentElement上的目標元素。 BindingExpression:路徑= txtMaturity;的DataItem = NULL;目標元素是'MaturityDependencyForValidation'(HashCode = 63478077);目標屬性是「成熟」(類型「字符串」)

RatioValidation規則內,的Maturity值永遠不會被從數據結合結合。我需要這個值來進行數據綁定。請幫忙。

回答

1

沒有DataContext爲周圍的物體,在最起碼的約束力,不DependencyObjects,你是有點在你的選擇有限的,它應該是類似時會發生什麼binding in an array,也看到this answer

+0

有什麼工作?我想驗證綁定到集合的ItemsControl中的單個(UserControl)項目。 usercontrol爲集合中的每個項目生成一行。它就像一個datagrid場景,我們可以指定rowvalidation屬性並驗證各個行項目。請提出建議嗎? – 2012-02-07 14:08:19

+0

@VinayDwivedi:如何看待鏈接的問題? – 2012-02-07 14:08:43

+0

謝謝你解決我的問題...看着http://stackoverflow.com/questions/8886309/templatebinding-not-working-on-validationrules-dependency-property ...而且它看起來像你的文章...但提供鏈接將有助於...非常感謝。 – 2012-02-10 03:29:09