我正在將綁定驗證應用於.NET 4.0中的一些WPF控件。目前,我的控件變爲紅色,並且在某些驗證規則集失敗時顯示一些警告消息。問題是,即使他們被禁用,他們仍然失敗了各自的驗證。這可能會誤導最終用戶,因此我只想驗證在啓用控件時運行。我不確定如何實現這個功能。只有啓用了控件才能在WPF中運行驗證
我通過Binding.ValidationRule通過一個特定的驗證類進行驗證。
編輯: 錯誤顯示的原因是因爲我的驗證檢查字段是否爲空。當表單加載時,這些字段是空的,即使它們被禁用也無法通過驗證。
我正在將綁定驗證應用於.NET 4.0中的一些WPF控件。目前,我的控件變爲紅色,並且在某些驗證規則集失敗時顯示一些警告消息。問題是,即使他們被禁用,他們仍然失敗了各自的驗證。這可能會誤導最終用戶,因此我只想驗證在啓用控件時運行。我不確定如何實現這個功能。只有啓用了控件才能在WPF中運行驗證
我通過Binding.ValidationRule通過一個特定的驗證類進行驗證。
編輯: 錯誤顯示的原因是因爲我的驗證檢查字段是否爲空。當表單加載時,這些字段是空的,即使它們被禁用也無法通過驗證。
讓我回答我的問題:
實在是沒有辦法從這個我的研究。禁用控件時不顯示驗證錯誤的最佳方法是創建一個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>
不會顯示紅色錯誤邊框。
另一種解決方案是通過AdornedElementPlaceholder
的AdornedElement
屬性從裝飾元素中提取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
還有其他的文本塊等。
將您的數據上下文的某些'bool'屬性綁定到控件的'IsEnabled'屬性。驗證時,檢查這個'bool'屬性並從'ValidationRule.Validate'返回'ValidationResult.ValidResult'。 – Dennis
我不相信有一個直接的機制來傳遞參數,除了你正在驗證的實際「價值」驗證方法。 –
另外,我需要完全在XAML中執行此操作,因爲此項目中有許多控件使用此特定樣式。換句話說,這不能涉及驗證器。 –