ich habe in einer WPF-Anwendung eine TextBox, die validiert werden muss. Die Validierung soll stattfinden, sobald die TextBox den Fokus verliert und mit txt.Focus() und txt.SelectAll() der fehlerhafte Inhalt markiert werden.
Soweit so gut, in meiner Anwendung ist das nachfolgende Control eine ComboBox. Wenn ich jetzt eine fehlerhafte Eingabe provoziere, führt der Fokus zu einer StackOverflowException, da die ComboBox jedesmal sich den Fokus wiederholt.
Hier die Controlvorlage:
<ControlTemplate x:Key="SplitTemplate">
<Expander IsExpanded="True" IsTabStop="False">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label />
<TextBox Grid.Column="1" />
<Label Grid.Row="1" Content="Rassenrestriktion" />
<ComboBox Grid.Column="1" Grid.Row="1" SelectedIndex="0"
ItemsSource="{Binding Source={StaticResource Races}, XPath=Race/Language}" />
<Label Grid.Row="2" Content="Rollenrestriktion" />
<ComboBox Grid.Column="1" Grid.Row="2" SelectedIndex="0"
ItemsSource="{Binding Source={StaticResource Roles}, XPath=Role}" />
<Label Grid.Row="3" Content="Attributsrestriktion" />
<ComboBox Grid.Column="1" Grid.Row="3" Name="cmbGeneralAttributeRestriction1" SelectedIndex="0"
ItemsSource="{Binding Source={StaticResource Attributes}, XPath=Attribute}" />
</Grid>
</Expander>
</ControlTemplate>
Ich lade die Controlvorlage und weise der TextBox ein LostFocus-EventHandler zu.
Mein EventHandler sieht so aus
private void txt_LostFocus(object sender, RoutedEventArgs e)
{
var txt = sender as TextBox;
int UnitsInSplit;
int TotalUnits;
bool IsGeneral;
StackPanel pnl;
if(txt.Text.Length==0)
{
return;
}
int.TryParse(txt.Text, out UnitsInSplit);
if ((((txt.Parent as Grid).Parent as Expander).Parent as StackPanel)
.Name.Contains("General"))
{
int.TryParse(txtGenerals.Text, out TotalUnits);
pnl = pnlGeneralSplit;
IsGeneral = true;
}
else
{
int.TryParse(txtTroops.Text, out TotalUnits);
pnl = pnlTroopSplit;
IsGeneral = true;
}
var Position = pnl.Children.IndexOf((txt.Parent as Grid).Parent
as Expander);
if (UnitsInSplit > TotalUnits)
{
txt.Focus();
txt.SelectAll();
}
if (UnitsInSplit < TotalUnits && Position == pnl.Children.Count - 1)
{
CreateNewSplit(pnl, IsGeneral);
return;
}
}
Ich habe zumindest das Problem soweit eingrenzen können, dass es auftritt, wenn ich mit der Tastatur navigiere. Wechsle ich den Fokus mit der Maus, tritt keine StackOverflowException auf. Hat jemand eine Idee, woran dies liegt und wie ich den Fehler beheben kann?