我最終落實@Will的建議。我在每個IDataErrorInfo
錯誤字符串(在這種情況下,我需要的只有2個選項,因此我使用「0」和「1」)的開頭處插入了一個字符。我創建了2 IValueConverter
s;爲每個背景和工具提示屬性:
public class WarningErrorBkgdConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
char firstChar = ((string)value)[0];
if (firstChar == '0')
{
return Brushes.Pink; // Error
}
Debug.Assert(firstChar == '1', "CANTHAPPEN: Expecting 1st char of string to be 1, was " + firstChar);
return Brushes.Gold; // Warning
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
public class WarningErrorTextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// Just ignore the error code
return ((string)value).Substring(1);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
我修改了TextBox
風格從原來的問題將這些轉換器:
<local:WarningErrorBkgdConverter x:Key="warningErrorBkgdConverter"/>
<local:WarningErrorTextConverter x:Key="warningErrorTextConverter"/>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent,
Converter={StaticResource warningErrorBkgdConverter}}"/>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent,
Converter={StaticResource warningErrorTextConverter}}"/>
</Trigger>
</Style.Triggers>
</Style>
然後在我的IDataErrorInfo
實施,樣例用法:
public string this[string propertyName]
{
get
{
uint testUint;
switch (propertyName)
{
case "YieldPsi1":
if (YieldPsi1 == "")
return null;
if (!UInt32.TryParse(YieldPsi1, out testUint))
return "0Must be a number";
if (testUint < 42000)
return "1Out of spec";
return null;
...
}
}
}
一切正常!
不是。 IDEI只返回字符串,因此您必須編碼一些其他信息,使用一個轉換器更改編碼元數據上的視覺效果,然後使用不同的轉換器來獲取消息。這有點不可思議,但有幾個不同的轉換器,你可以擺動它。哈克,但很快。或者,您也可以掛鉤驗證系統並修改它以使用不同的數據錯誤界面。我從來沒有這樣做過,但如果我嘗試過,我必須深入研究源代碼,看看它是如何工作的,以及我可以進入驗證管道的位置。 – Will
@謝謝。我剛剛發生了「INotifyDataErrorInfo」 - 是否包含(顯式)設施來執行我想要的操作? – Conrad
否。從界面返回的錯誤是字符串。您無法擴展字符串,因此您可以以某種方式在UI中進行驗證並使用設計的不同驗證界面,或者使用轉換器並以某種方式將有關錯誤的元數據編碼爲字符串。 – Will