Я пытаюсь получить текстовое поле для проверки в WPF. Проблема заключается в том, что когда в текстовое поле не введены данные, которые должны вызвать ошибку проверки, ошибка проверки не отображается. Может ли кто-нибудь помочь мне? Заранее спасибо. Вот мой код
public class User
{
private string _name;
public string myName
{
get { return _name; }
set
{
_name = value;
if (String.IsNullOrEmpty(value))
{
throw new ApplicationException("User name is mandatory.");
}
}
}
}
<TextBox Height="23"
HorizontalAlignment="Right"
Margin="0,0,194,250" Name="textBox1"
VerticalAlignment="Bottom"
Width="120" >
<TextBox.Text>
<Binding Path="myName" >
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Редактировать: У меня действительно была проблема с привязкой. Я исправил свой код, вот он:
Я начал с создания пользователя и шаблона ошибки:
<local:User x:Key="myDataSource" myName="Enter Name" />
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!!!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
После этого у меня была отключена кнопка сохранения, если были ошибки проверки
<Button Content="Write Kml"
Height="23"
HorizontalAlignment="Right"
Margin="0,0,12,41"
Name="writeKml"
VerticalAlignment="Bottom"
Width="75" Click="button2_Click" >
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="false" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=textBox1, Path=(Validation.HasError)}" Value="false">
<Setter Property="IsEnabled" Value="true" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
Затем я исправил textBox, чтобы обеспечить правильную проверку
<TextBox Height="23"
HorizontalAlignment="Right"
Margin="0,0,194,250"
Name="textBox1"
VerticalAlignment="Bottom"
Validation.ErrorTemplate="{StaticResource validationTemplate}"
Width="120" >
<TextBox.Text>
<Binding
Source="{StaticResource myDataSource}"
Path="myName"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnExceptions="True"
ValidatesOnDataErrors="True" >
<Binding.ValidationRules>
<local:CheckName />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
вот код
public class User
{
private string _name;
public string myName
{
get { return _name; }
set { _name = value; }
}
}
public class CheckName : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value == null || object.Equals(value, string.Empty))
{
return new ValidationResult(false, "Please enter user name");
}
if (value.ToString() == "Enter Name")
{
return new ValidationResult(false, "Please enter user name");
}
return new ValidationResult(true, null);
}
}
наконец, я добавил код в подпрограмму, загруженную в окно, для принудительной проверки
private void Window_Loaded(object sender, RoutedEventArgs e)
{
textBox1.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
Надеюсь, это поможет любому, кто пытается выполнить проверку текстового поля в WPF.