2013-06-28 72 views
4

我正在將綁定驗證應用於.NET 4.0中的一些WPF控件。目前,我的控件變爲紅色,並且在某些驗證規則集失敗時顯示一些警告消息。問題是,即使他們被禁用,他們仍然失敗了各自的驗證。這可能會誤導最終用戶,因此我只想驗證在啓用控件時運行。我不確定如何實現這個功能。只有啓用了控件才能在WPF中運行驗證

我通過Binding.ValidationRule通過一個特定的驗證類進行驗證。

編輯: 錯誤顯示的原因是因爲我的驗證檢查字段是否爲空。當表單加載時,這些字段是空的,即使它們被禁用也無法通過驗證。

+0

將您的數據上下文的某些'bool'屬性綁定到控件的'IsEnabled'屬性。驗證時,檢查這個'bool'屬性並從'ValidationRule.Validate'返回'ValidationResult.ValidResult'。 – Dennis

+0

我不相信有一個直接的機制來傳遞參數,除了你正在驗證的實際「價值」驗證方法。 –

+0

另外,我需要完全在XAML中執行此操作,因爲此項目中有許多控件使用此特定樣式。換句話說,這不能涉及驗證器。 –

回答

2

讓我回答我的問題:

實在是沒有辦法從這個我的研究。禁用控件時不顯示驗證錯誤的最佳方法是創建一個Validation.ErrorTemplate,該控件在控件未通過驗證並被禁用時是特殊的。我用這種技術來解決這個問題。

線沿線的東西:當驗證失敗和控制被禁用

<Trigger Property="IsEnabled" Value="false"> 
       <Setter Property="Validation.ErrorTemplate"> 
        <Setter.Value> 
         <ControlTemplate> 
          <DockPanel> 
           <Border BorderBrush="Gray" BorderThickness="0"> 
            <AdornedElementPlaceholder/> 
           </Border> 
          </DockPanel> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 

不會顯示紅色錯誤邊框。

0

另一種解決方案是通過AdornedElementPlaceholderAdornedElement屬性從裝飾元素中提取IsEnabled的值。在下面的示例中,我使用IsEnabled="{Binding ElementName=customAdorner, Path=AdornedElement.IsEnabled}"。然後你可以像平常一樣觸發IsEnabled

<Style x:Key="TextBoxValidationStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
     <ControlTemplate> 
      <DockPanel IsEnabled="{Binding ElementName=customAdorner, Path=AdornedElement.IsEnabled}"> 
      <AdornedElementPlaceholder x:Name="customAdorner"> 
       <Border x:Name="Border" BorderThickness="1"> 
       <Border.Style> 
        <Style TargetType="Border"> 
        <Style.Triggers> 
         <Trigger Property="IsEnabled" Value="False"> 
         <Setter Property="BorderBrush" Value="Transparent" /> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="True"> 
         <Setter Property="BorderBrush" Value="Red" /> 
         </Trigger> 
        </Style.Triggers> 
        </Style> 
       </Border.Style> 
       </Border> 
      </AdornedElementPlaceholder> 
      </DockPanel> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 

的好處是,這種方法可以更容易地維持佈局時沒有錯誤,如果你已經在你的ErrorTemplate還有其他的文本塊等。

相關問題