Usando validação em WPF Com Propriedade de Dependência e Estilo Triggers
-
01-07-2019 - |
Pergunta
Eu estou tentando usar validação no WPF. Eu criei um NotNullOrEmptyValidationRule como mostrado abaixo:
public class NotNullOrEmptyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (String.IsNullOrEmpty(value as String))
return new ValidationResult(false, "Value cannot be null or empty");
return new ValidationResult(true, null);
}
}
Agora, eu preciso usá-lo em meu aplicativo. No meu arquivo App.xaml I declarou o estilo para o TextBox. Aqui está a declaração.
<Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Green"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Agora, eu quero usá-lo em minha caixa de texto, por isso estou usando o seguinte código:
<TextBox Style="{StaticResource textBoxStyle}">
<TextBox.Text>
<Binding>
<Binding.ValidationRules>
<NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
O erro vem na NotNullOrEmptyValidationRule Tag. O verificador de sintaxe XAML não é capaz de resolver o NotNullOrEmptyValidationRule. Eu até tentei colocar o namespace mas não parece trabalho.
Solução
i ver a sua ligação na caixa de texto está definido para um caminho de 'Texto' - é que um campo em qualquer que seja o datacontext desta caixa de texto é? é a caixa de texto realmente recebendo um valor colocar nele? Também, se você colocar um ponto de interrupção em seu método de validação, é que alguma vez ser demitido?
Você pode querer pesquisar como falhas login ligação e rever as também ..
Outras dicas
Você só precisa adicionar os xmlns à sua janela, e usar isso para fazer referência a seu ValidationRule.
Em WPF, o objeto é perfeitamente bem para ser usado a partir do mesmo conjunto.
Uma vez que a sua regra não é definido no namespace XAML padrão, você tem que criar um mapeamento para o seu namespace clr assim:
<Window ...
xmlns:local="clr-namespace:MyNamespaceName">
E então você iria utilizá-lo assim:
<Binding Path=".">
<Binding.ValidationRules>
<local:NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
Editar Eu adicionei uma declaração Caminho para a vinculação. Você tem que dizer o Binding o que se ligam a:)
Você não tem essa linha em seu código por trás
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
Me.**NameOfTextBox**.DataContext = Me
End Sub
Há um bug no Visual Studio e Expression Blend que causa esse problema. O que você precisa fazer é se certificar de que a regra de validação é em um projeto separado / montagem que você pode fazer referência. Isto deve resolver o problema.
No entanto, você terá que adicionar de volta o espaço de nomes em ordem para que ele funcione.