| 

.NET C# Java Javascript Exception

3
Hallo zusammen,

ich validiere gerade Eingaben indem ich Min und Max Werte für den Validator binde:
<Window.Resources>
<View:DataResource x:Key="minHeight" BindingTarget="{Binding MinHeight}"/>
<View:DataResource x:Key="maxHeight" BindingTarget="{Binding MaxHeight}"/>
</Window.Resources>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>


<TextBox  Style="{StaticResource textBoxInError}">
<TextBox.Text>
<Binding Path="Height" Converter="{StaticResource doubleToLengthStringConverter}" UpdateSourceTrigger="LostFocus" >
<Binding.ValidationRules>
<View:LengthValidationRule x:Name="HeightValidation" ValidatesOnTargetUpdated="True"
Min="{View:DataResourceBinding DataResource={StaticResource minHeight}}"
Max="{View:DataResourceBinding DataResource={StaticResource maxHeight}}"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>



internal class LengthValidationRule : ValidationRule
{
public double? Min { get; set; }


public double? Max { get; set; }

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
try
{
var l = new Length((string) value, Main.Services.UnitFunctions.IsDrawingMetric());
double doubleValue = l[Length.Units.mm];
if (Min.HasValue)
{
if (doubleValue < Min)
return new ValidationResult(false, Main.Services.I18n.GetLabel("CircularWorkingScafoldAssistant.ValueTooSmall"));
}
if (Max.HasValue)
{
if (doubleValue > Max)
return new ValidationResult(false, Main.Services.I18n.GetLabel("CircularWorkingScafoldAssistant.ValueTooBig"));
}
return new ValidationResult(true, null);
}
catch (ArgumentException ex)
{
return new ValidationResult(false, ex.Message);
}
catch (Exception ex)
{
return new ValidationResult(false, ex.Message);
}
}



Unabhängig ob ich im ViewModel ein Property double oder double? für die Min und Max Werte nutze bekomme ich eine Meldung eine First chance of System.InvalidCastException im Outputfenster angezeigt. Wenn ich das ganze nun per Debug->Exceptions mir direkt fangen lassen bekomme ich die folgende Fehlermeldung.

System.InvalidCastException occurred
Message: Invalid cast from 'System.Double' to 'System.Nullable`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.

Was besonders anstrengend ist, ist dass VS2010 abstürzt/einfriert wenn ich letzt genannte Meldung nicht schnell genug mit OK bestätige.

Die Funktionalität der Validierung ist zwar gegeben, doch was mache ich falsch?
News:
28.11.2011
KCT 937 1 1 8
2 Antworten
0
Läuft denn (außerhalb von Visual Studio, also in einer "echten" Umgebung) die Anwendung wie gewünscht? Als ersten Schritt solltest Du klären, ob es sich um ein Problem mit dem VS-Debugger handelt oder mit Deinem Code. Könnte gut sein, dass es völlig normal ist, dass diese Exception fliegt (und irgendwo später wieder gefangen wird), und dass nur der Debugger bzw. WPF ein Problem damit hat, wenn Du den Code gerade an der Stelle anhältst.
28.11.2011
Matthias Hlawatsch 13,2k 4 9
Die Anwendung läuft (auch durch VS gestartet) so wie es sein soll. Mich hat nur die Meldung im Outputfenster gestört, da es normalerweise ein Hinweis auf potentielle Fehlerquellen ist.
Wenn ich es umstelle per Debug->Exceptions->Throw dann hält VS zwar an aber - da in unknown module - in der gerade offenen Datei. Ohne, dass man da weiter debuggen kann.
KCT 29.11.2011
0
Wenn ich die MSDN richtig verstehe, solltest du es vielleicht so versuchen:

...
double doubleValue = l[Length.Units.mm];
if (Min.HasValue)
{
if (doubleValue < (double) Min)
return new ValidationResult(false, Main.Services.I18n.GetLabel("CircularWorkingScafoldAssistant.ValueTooSmall"));
}
if (Max.HasValue)
{
if (doubleValue > (double) Max)
return new ValidationResult(false, Main.Services.I18n.GetLabel("CircularWorkingScafoldAssistant.ValueTooBig"));
}
return new ValidationResult(true, null);
...

und so weiter und so fort...
Ähnliches kann man für einen nullable bool hier nachlesen:

How to: Safely Cast from bool? to bool
28.11.2011
Eiger 1,9k 2 9
Danke, dort hatte ich es noch keinen Cast. Aber leider nicht die Lösung. Der Hinweis auf First chance for InvalidCastException in unknown module kommt jedoch immer noch.
KCT 29.11.2011

Stelle deine .net-Frage jetzt!