Имам текстово поле с много прост 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;
}
}
Проблемът е, че червената граница за грешка при валидиране се показва при стартиране, въпреки че текстовото поле е обвързано с непразни данни.
Гледайки точка на прекъсване на правилото за валидиране, Iвижте, че се извиква веднъж за празен низ (преди свързването да се промени на валидни данни) и още веднъж след актуализиране на свързването на валидни данни. Разбира се, второто обаждане връща ValidResult, но червената граница остава.
Ръчно изчистване на текстовото поле и въвеждане на нов текст в него изчиства червената граница, но просто въвеждането на нов текст в нея, без първо да го изчистите, не го прави.
Единствената потенциална хитрост, която мога да видя, отчетене на други хора "въпроси, е, че този TextBox е в контрол на раздела. Въпреки това, проблемът ми е обратното на тези други хора (те" не получават червена граница въпреки неуспешно валидиране), нито пък се премества в друг раздел контрол по всяко време (което е и причината за другите проблеми).
Някакви идеи, които съм изчезнал тук?
Отговори:
1 за отговор № 1Оказва се, че промяната на валидирани обвързани даннипо време на събитие Window "Loaded причината за проблема. В моя случай, проблемът беше решен чрез извършване на промяна на данните по време на Initialized или ContentRendered. да мига по време на зареждане на приложението.
0 за отговор № 2
Опитах се да репликирам проблема ви, но изглежда, че работи добре в тестовете ми, така че проблемът трябва да е с данните, които обвързвате, както казахте validationRule
работи добре.
Таблицата ли се свързва с вас TwoWay
?
Моят тест:
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>
код:
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");
}
}