gpt4 book ai didi

c# - 来自属性设置函数的 WPF 数据验证

转载 作者:太空宇宙 更新时间:2023-11-03 11:46:12 26 4
gpt4 key购买 nike

我有一个绑定(bind)到 GUI 元素的类,如下所示:

<TextBox Style="{StaticResource ValidatedTextBox}" 
Text="{Binding MaxDistance, ValidatesOnExceptions=True}" >
<TextBox.Style>
<Style TargetType="TextBox" >
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip">
<Setter.Value>
<Binding Path="(Validation.Errors).CurrentItem.ErrorContent"
RelativeSource="{RelativeSource Self}" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>

MaxDistance 属性的 setter 在此处实现:

public float MaxDistance
{
get { return m_maxDistance; }
set
{
// Check for valid values
if (value < MinDistance)
throw new ArgumentException(
"Max distance must be greater than min distance");

m_maxDistance = value;
}
}

问题是,当我在 TextBox 中输入无效值时,出现的工具提示显示“调用目标已抛出异常”而不是“最大距离必须大于最小距离”。

我应该怎么做才能让工具提示读取 ArgumentException 的字符串?注意:标准类型转换异常也必须正确显示(即,如果我输入字符串而不是 float ,标准错误消息仍应出现)。

我无法将异常移动到 IDataErrorInfo 接口(interface)中,因为如果数据无效则不能在对象上设置数据,并且由于该属性与对象的其他属性相互依赖,因此无法完成此验证通过转换器或典型的验证规则...

在上面的示例中,验证在那里并且有效,它只是没有向用户提供有用的信息。

感谢帮助

最佳答案

看来解决此问题的唯一方法是使工具提示绑定(bind)更智能。

我将工具提示上的绑定(bind)更改为:

<Binding Path="(Validation.Errors)[0]"
RelativeSource="{RelativeSource Self}"
Converter="{StaticResource ValidationExceptionConverter}"/>

并实现转换器如下:

    public class ValidationExceptionConverter : IValueConverter
{
#region IValueConverter Members

// From string to
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ValidationError error = value as ValidationError;
if (error == null)
return null;

Exception exception = error.Exception;
if (exception == null)
{
return error.ErrorContent;
}
else
{
// Find the innermost exception
while (exception.InnerException != null)
exception = exception.InnerException;

// Use it's message as output
return exception.Message;
}
}

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

#endregion
}

关于c# - 来自属性设置函数的 WPF 数据验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3385835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com