Eu criei uma classe que usar os atributos de "System.ComponentModel.DataAnnotations", para realizar os binding com o objeto que quero editar, porem se eu não fizer qualquer alteração no controle(ex: TextBox) ele não valida. Como faço pra forcar essa validação e mostrar no controle como se tivesse feito a alteração no controle.
Ex:
Codigo
public class Empresa : INotifyPropertyChanged
{
int _codigo;
public int Codigo
{
get { return _codigo; }
set
{
Validate(value, "Codigo");
_codigo = value;
FirePropertyChanged("Codigo");
}
}
string _nome;
[Required(ErrorMessage="Nome da Empresa é obrigatório")]
public string Nome
{
get { return _nome; }
set
{
Validate(value, "Nome");
_nome = value;
FirePropertyChanged("Nome");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void FirePropertyChanged(string propertyname)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyname));
}
protected void Validate(object value, string propertyName)
{
Validator.ValidateProperty(value,
new ValidationContext(this, null, null) { MemberName = propertyName });
}
}
Controle
<StackPanel>
<TextBox Text="{Binding Nome, Mode=TwoWay, ValidatesOnExceptions=True}" />
<Button x:Name="btnSalvar" Click="btnSalvar_Click">Salvar</Button>
</StackPanel>
Eu quero quando clicar no botao salvar ele verifica o objeto em DataContext que tem a classe e verifica se é valido, se não for fazer o mesmo comportamento do controle.
Isso é para uma classe com mais de 10 propriedades, coloquei esse exemplo pra tentar ajudar no meu problema.
Tentei usar o DataForm do toolkit, porem ha um data grid interno do formulario, quando faco alteração nela o DataForm não reconhece a alteração e não habilita o botão submit.
Tags:
Compartilhar Twitter Facebook Facebook
Exibições: 89
Olá Fagner.
Você já tentou colocar:
<TextBox Text="{Binding Nome, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}" />
Até mais.
Permalink Responder até Fagner Colóia Paes Barreto em 29 abril 2011 at 15:07
Permalink Responder até Fagner Colóia Paes Barreto em 29 abril 2011 at 15:11
Fiz quase que uma POG para atualizar todos os os controles de um determinado panel, adaptado a minha necessidade.
Se tiver outra ideia mais sofisticada tipo "Control.ValidateChildrens()"
public static void UpdateSourceControls(Panel panel)
{
foreach (UIElement e in panel.Children)
{
if (e is Panel)
{
UpdateSourceControls(e as Panel);
}
else
{
BindingExpression bindingExpression = null;
if (e is TextBox)
{
TextBox t = e as TextBox;
bindingExpression = t.GetBindingExpression(TextBox.TextProperty);
}
else if (e is ComboBox)
{
ComboBox c = e as ComboBox;
bindingExpression = c.GetBindingExpression(ComboBox.SelectedValueProperty);
}
else if (e is AutoCompleteBox)
{
AutoCompleteBox acb = e as AutoCompleteBox;
bindingExpression = acb.GetBindingExpression(AutoCompleteBox.TextProperty);
}
else if (e is DatePicker)
{
DatePicker dp = e as DatePicker;
bindingExpression = dp.GetBindingExpression(DatePicker.SelectedDateProperty);
}
else if (e is TimePicker)
{
TimePicker tp = e as TimePicker;
bindingExpression = tp.GetBindingExpression(TimePicker.ValueProperty);
}
else if (e is RadioButton)
{
RadioButton rb = e as RadioButton;
bindingExpression = rb.GetBindingExpression(RadioButton.IsCheckedProperty);
}
else if (e is CheckBox)
{
CheckBox cb = e as CheckBox;
bindingExpression = cb.GetBindingExpression(CheckBox.IsCheckedProperty);
}
else if (e is Border)
{
UpdateSourceControls(e as Border);
}
if (bindingExpression != null) bindingExpression.UpdateSource();
}
}
}
public static void UpdateSourceControls(Border control)
{
if (control.Child is Border)
{
UpdateSourceControls(control.Child as Border);
}
else if(control.Child is Panel)
{
UpdateSourceControls(control.Child as Panel);
}
}
© 2013 Criado por Alexandre Tarifa.
Ativado por