2008-09-18 75 views
1

我想在WPF中使用驗證。我創建了一個NotNullOrEmptyValidationRule,如下所示:在依賴屬性和樣式觸發器的WPF中使用驗證

public class NotNullOrEmptyValidationRule : ValidationRule 
    { 
     public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
     { 
      if (String.IsNullOrEmpty(value as String)) 
       return new ValidationResult(false, "Value cannot be null or empty"); 

      return new ValidationResult(true, null); 
     } 
    } 

現在,我需要在我的應用程序中使用它。在我的App.xaml文件中,我爲TextBox聲明瞭樣式。這是宣言。

<Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}"> 

      <Setter Property="Background" Value="Green"/> 

      <Style.Triggers> 

       <Trigger Property="Validation.HasError" Value="True"> 

        <Setter Property="Background" Value="Red"/> 
        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/> 

       </Trigger> 

      </Style.Triggers> 

     </Style> 

現在,我想用我的文本框,所以我用下面的代碼:

<TextBox Style="{StaticResource textBoxStyle}"> 
       <TextBox.Text> 
        <Binding> 
         <Binding.ValidationRules> 
          <NotNullOrEmptyValidationRule /> 
         </Binding.ValidationRules> 
        </Binding> 
       </TextBox.Text> 


      </TextBox> 

的錯誤出現在標籤上NotNullOrEmptyValidationRule。 XAML語法檢查器無法解析NotNullOrEmptyValidationRule。我甚至嘗試過放入命名空間,但它似乎不起作用。

回答

1

我看到你在TextBox上的綁定設置爲'文本'的路徑 - 是不管這個文本框的datacontext是什麼字段?文本框是否真正獲得了價值?另外,如果你在你的驗證方法中加入了一個斷點,是否會被解僱?

你可能要查找如何登錄失敗的約束力和審查這些以及..

0

Visual Studio和Expression Blend中存在導致此問題的錯誤。您需要做的是確保驗證規則位於您可以引用的單獨項目/程序集中。這應該可以解決問題。

但是,您必須添加名稱空間才能使其工作。

5

您只需將xmlns添加到您的窗口,並使用它來引用您的ValidationRule。

在WPF中,該對象完全可以在同一個程序集中使用。

由於您的規則不標準XAML命名空間中定義,你必須創建一個映射到你的CLR命名空間,如下所示:

<Window ... 
    xmlns:local="clr-namespace:MyNamespaceName"> 

然後你可以使用它像這樣:

<Binding Path="."> 
    <Binding.ValidationRules> 
     <local:NotNullOrEmptyValidationRule /> 
    </Binding.ValidationRules> 
</Binding> 

編輯 我向綁定添加了一條Path語句。你必須告訴綁定綁定到:)

1

你沒有這條線我們的代碼背後

Public Sub New() 

    ' This call is required by the Windows Form Designer. 
    InitializeComponent() 

    Me.**NameOfTextBox**.DataContext = Me 
End Sub