/ / WPF TextBox Czerwona ramka nadal wyświetlana po udanym ValidationRule - wpf, validationrule

Ramka tekstowa RedBox WPF nadal wyświetlana po pomyślnym sprawdzeniu poprawności - wpf, validationrule

Mam pole tekstowe z bardzo prostym ValidationRule:

<TextBox x:Name="textFirstName" Width="120">
<TextBox.Text>
<Binding
Path="CurrentSelectionData.Tables[cpeople].Rows[0][FirstName]"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:NonEmptyStringValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

public class NonEmptyStringValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
return new ValidationResult(false, "Must provide a value.");

return ValidationResult.ValidResult;
}
}

Problem polega na tym, że podczas uruchamiania pojawia się czerwona granica błędu sprawdzania poprawności, mimo że pole tekstowe jest powiązane z niepustymi danymi.

Oglądając punkt przerwania reguły sprawdzania poprawności, Izobacz, że jest ona wywoływana raz dla pustego łańcucha (przed zmianą powiązania na poprawne dane) i ponownie po aktualizacji powiązań z poprawnymi danymi. Rzeczywiście, drugie wywołanie zwraca ValidResult, ale czerwona ramka pozostaje.

Ręczne czyszczenie pola tekstowego i wpisywanie do niego nowego tekstu czyści czerwoną ramkę, ale po prostu wpisując do niej nowy tekst bez wcześniejszego wyczyszczenia go nie ma.

Jedyna potencjalna sztuczka, którą widzęCzytam pytania innych ludzi, czy ten TextBox znajduje się w kontrolce kart. Jednak mój problem jest przeciwieństwem tych innych ludzi (nie uzyskali czerwonej granicy pomimo nieudanego sprawdzania poprawności), ani nie przechodzę do innej karty kontrola w dowolnym momencie (co było przyczyną innych problemów).

Jakieś pomysły, czego tu brakuje?

Odpowiedzi:

1 dla odpowiedzi № 1

Okazuje się, że zmiana zweryfikowanych powiązanych danychPodczas zdarzenia Loaded spowodowało problem. W moim przypadku problem został rozwiązany przez zamianę danych podczas Inicjalizacji lub ContentRendered. Inicjalizacja ma tę zaletę, że dzieje się przed pierwszym (nieprawidłowym) powiązaniem, unikając tymczasowej czerwonej granicy migać podczas ładowania aplikacji.


0 dla odpowiedzi nr 2

Próbowałem powtórzyć twój problem, ale wydaje się, że działa dobrze w moich testach, więc problem musi dotyczyć danych, do których jesteś zobowiązany, jak powiedziałeś validationRule działa dobrze.

Czy tabela jest wiążąca TwoWay?

Mój test:

xaml:

<TextBox x:Name="textFirstName" Width="120" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}">
<TextBox.Text>
<Binding ElementName="UI" Path="TextTest" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" >
<Binding.ValidationRules>
<local:NonEmptyStringValidationRule ValidatesOnTargetUpdated="True"  />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

kod:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private string _textTest;
public string TextTest
{
get { return _textTest ; }
set { _textTest = value; }
}
}

public class NonEmptyStringValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
return (value is string && !string.IsNullOrEmpty(value.ToString()))
? new ValidationResult(true, null)
: new ValidationResult(false, "Invalid Text");
}
}