2011-01-05 46 views
2

我使用MVVM和我的對象實現IDataErrorInfo。當設置屬性時,我運行自定義驗證方法,如果驗證通過,則返回String.empty,它將Validation.HasError設置爲false。如果驗證失敗,則將Validation.HasError設置爲true。我有用於「所需的控制」(將執行驗證控件),並設置是控制的工具提示任何錯誤是這樣的風格:Validation.HasError不會再次觸發,如果新錯誤進入而已經爲真

<Style x:Key="RequiredControl" TargetType="{x:Type Control}" > 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" Value="{Binding (Validation.Errors), Converter={StaticResource ErrorConverter}, RelativeSource={x:Static RelativeSource.Self}}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

而且ErrorConverter:

public class ZynErrorContentConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var errors = value as ReadOnlyObservableCollection<ValidationError>; 
     if (errors == null) return ""; 

     return errors.Count > 0 ? errors[0].ErrorContent : ""; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

問題是這樣的:用戶輸入一些無效的...並將Validation.HasError設置爲true。工具提示會按照預期進行更新。如果用戶嘗試更正錯誤,但輸入的值會導致不同類型的失效,則工具提示應顯示新的錯誤字符串,但這種情況不會發生。該錯誤顯示爲與第一個錯誤相同的錯誤。我知道爲什麼會發生這種情況(我認爲)...因爲觸發器沒有觸發,因爲Validation.HasError永遠不會從True - > False - > True改變。

有沒有人有任何這方面的經驗或一些建議如何強制觸發?

+0

我有同樣的問題 - 你設法解決這個問題嗎? – pilsdumps 2011-03-22 14:47:59

+0

不,從來沒有。仍在擾亂我。 – Thelonias 2011-03-24 15:18:21

回答

3

這似乎是答案:IDataErrorInfo With Multiple Error Messages for a Property

基本上,你綁定到當前項目,並使用ContentPresenter顯示錯誤。它爲我的代碼工作。

+0

是的,你是對的,我的答案中的提案不起作用 - 現在回答刪除。 – Slauma 2011-04-01 14:21:42

+0

我仍然使用工具提示,但我現在改用CurrentItem。謝謝(你的)信息。 – Thelonias 2011-06-23 14:56:22

2

我相信我已經想通了。罪魁禍首是轉換器的使用。 我遇到同樣的問題,這個問題的代碼片段是:

<Setter Property="ToolTip" 
     Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
         Path=(Validation.Errors), 
         Converter={StaticResource validationErrorsToStringConverter }}"/> 

我更改了代碼段:

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

和問題就解決了。

結論 - 不要使用轉換器。

+0

非常感謝您發佈此解決方案。 – alexandrudicu 2015-10-26 16:54:55

相關問題