2014-04-01 51 views
1

我有幾個文本框,我想執行某些規則。例如,我有一個綁定到Name屬性的Name文本框,並且我不需要任何| <或>該屬性中存在的字符。爲了做到這一點,我創建了下面的類,從有效性規則繼承:捕獲驗證規則已被違反,以防止用戶保存

class NoInvalidCharsRule : ValidationRule 
{ 
    private static char[] mInvalidChars = Path.GetInvalidPathChars(); 

    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     String stringValue = value.ToString(); 

     foreach (char invalidChar in mInvalidChars) 
     { 
      if (stringValue.Contains(invalidChar)) 
      { 
       return new ValidationResult(false, "Invalid characters are present in the string."); 
      } 
     } 

     return new ValidationResult(true, ""); 
    } 
} 

,並在我的.xaml如下綁定:

<pres:OneTextBox Watermark="Name..." Margin="85,12,0,0" 
        AcceptsReturn="False" MaxLines="1" Height="22" VerticalAlignment="Top" 
        HorizontalAlignment="Left" Width="300" Style="{StaticResource ErrorStyleTextBox}"> 
     <Validation.ErrorTemplate> 
      <ControlTemplate> 
       <DockPanel LastChildFill="True"> 
        <AdornedElementPlaceholder/> 
        <TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="20">!</TextBlock> 
       </DockPanel> 
      </ControlTemplate> 
     </Validation.ErrorTemplate> 
     <pres:OneTextBox.Text> 
      <Binding Path="InterfaceSpecification.Name" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True" > 
       <Binding.ValidationRules> 
        <interfaceSpecsModule:NoInvalidCharsRule ValidationStep="RawProposedValue" /> 
       </Binding.ValidationRules> 
      </Binding> 
     </pres:OneTextBox.Text> 
    </pres:OneTextBox> 

還有一個「完成」按鈕,我如果名稱文本框中有無效字符,則應該禁用該按鈕或單擊該按鈕時,會彈出一個窗口,告訴用戶存在無效字符。

現在,我所做的代碼僅在紅色的文本框中突出顯示,如果此類字符存在。如果在文本框中找到無效字符,我將如何禁用該按鈕?

編輯:我知道一旦無效字符寫入文本框中,名稱屬性將停止更新。不幸的是,它仍然包含無效字符前的所有內容,我想停止用戶只用幾個有效字符而不是他想要輸入的全名保存該名稱(通過按下done按鈕)。

+0

問題是,什麼是OneTextBox?它是從TextBox派生的嗎? – BlueM

+0

@BlueM是的,它來自TextBox。我正在使用一個自定義框架來封裝幾乎每個WPF控件以增強其功能。 – Choub890

回答

1

只要你命名你的文本框nameTextBox這將是:

<Button Name="doneButton" Content="Done" IsDefault="True"> 
    <Button.Style> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="IsEnabled" Value="false" /> 
     <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding ElementName=nameTextBox, Path=(Validation.HasError)}" Value="false" /> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="IsEnabled" Value="true" /> 
     </MultiDataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Button.Style> 
</Button> 

如果需要,您可以指定多個條件。

+0

有沒有辦法顯示消息框而不是禁用它?如果可能,這將是我首選的解決方案。 – Choub890

+0

然後,您必須檢查完成按鈕命令處理程序中每個元素的驗證結果。 – BlueM

+0

@ Choub890由於可用性,我不會彈出消息框。出現錯誤時,立即在文本框的正上方顯示有關問題的紅色提示。這是更現代化的,並不妨礙流量。這可能是幫助=> http://stackoverflow.com/questions/6753206/wpf-validation-errors-how-to-show-in-separate-textblock-not-in-tooltip – BlueM