Codificando .Net

Aprendizado, companherismo, ensino e aperfeiçoamento constante

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.

Exibições: 89

Respostas a este tópico

Olá Fagner.

 

Você já tentou colocar:

<TextBox Text="{Binding Nome, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}" />

 

Até mais.
Tentei agora e não funcionou.

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);
            }
        }

 

 

RSS

Patrocínios

 

 

Comunidade Daruma 

Editora O'Reilly 

 

© 2013   Criado por Alexandre Tarifa.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço