2012-02-07 17 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:Path = txtMaturity; DataItem = null;ターゲット要素は 'MaturityDependencyForValidation'(HashCode = 63478077)です。プロパティが「成熟」(タイプ「文字列」)

され、RatioValidationルール内、Maturityの値は、データバインディングからバインドされることは決してありませんターゲットにしています。データバインディングにはこの値が必要です。助けてください。

答えて

1

周囲の物体として何DataContextはありませんが、非常に少なくとも、結合、DependencyObjectsではありません、あなたが多少選択肢が制限されている、それはまた、this answerを参照してください、ときbinding in an array何が起こるかのようになります。

+0

回避策はありますか?コレクションにバインドされているItemsControlの個々の(UserControl)アイテムを検証する必要があります。ユーザーコントロールは、コレクション内の各アイテムに対して1つの行を生成します。 RowValidationプロパティを指定して個々の行アイテムを検証できるDataGridシナリオのようなものです。何か提案してください? –

+0

@VinayDwivedi:リンクされた質問を見るのはどうですか? –

+0

私の問題を解決していただきありがとうございます... http://stackoverflow.com/questions/8886309/templatebinding-not-working-on-validationrules-dependency-propertyを見てください...また、あなたの記事のように見えます...リンクを提供することは助けになりました...どうもありがとうございました。 –

関連する問題