Serialize a class to xml after it passes the binding validation in wpf c #

1

I have a project in WPF with a configuration file in XML

I have made a ViewModel class that is Binded to MainWindow.xaml, and I have done one validator using IDataErrorInfo and classes with the ValidationRule interface.

What I want is that, if a user changes a value in the view, and the value passes the validation, the class is serialized to XML automatically.

To serialize the class I use a class extension:

public static class ConfiguracionExtension
{
    public static void Save(this Configuration configXML)
    {
        string ConfigPath = AppDomain.CurrentDomain.BaseDirectory + "config.xml";
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        XmlSerializer serializer = new XmlSerializer(typeof(Configuration));
        Stream writer = new FileStream(ConfigPath, FileMode.Create);
        ns.Add("", "");
        serializer.Serialize(writer, configXML, ns);
        writer.Close();
    }
}

The Configuration class looks like this:

[Serializable, XmlRoot("configuration")]
public class Configuration : IDataErrorInfo, INotifyPropertyChanged
{
    private int _minute;
    [XmlElement]
    public int minute
    {
        get
        {
            return _minute;
        }
        set
        {
            _minute = value;
            OnPropertyChanged("minute");
        }
    }
    public static Configuration Load()
    {
        string ConfigPath= AppDomain.CurrentDomain.BaseDirectory + "config.xml";
        if (File.Exists(ConfigPath))
        {
            try
            {
                XmlSerializer _s = new XmlSerializer(typeof(Configuration));
                return (Configuration)_s.Deserialize(new XmlTextReader(ConfigPath));
            }
            catch (Exception ex)
            {
                Auxiliar.writeError(ex.ToString());
                return new Configuration();
            }
        }
        else
            return new Configuration();
    }
    public Configuracion()
    {
        minutes = 60;
    }
    #region IDataErrorInfo Members
    public string Error
    {
        get { return String.Empty; }
    }

    public string this[string columnName]
    {
        get
        {
            String errorMessage = String.Empty;
            switch (columnName)
            {
                case "minute":
                    if (minute < 1)
                    {
                        errorMessage = "Los minutos no pueden ser menos de 1";
                    }
                    break;
            }
            return errorMessage;
        }
    }
    #endregion
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(String propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

And the validation class is like this:

public class MinutesValidation : ValidationRule
{
    private int _min;
    public int Minimum
    {
        get { return _min; }
        set { _min = value; }
    }
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int minute;
        Boolean noIllegalChars;
        noIllegalChars = int.TryParse(value.ToString(), out minute);

        if (value.ToString().Length < 1)
        {
            return new ValidationResult(false, "Minutos no puede estar vacio");
        }
        else if (noIllegalChars == false)
        {
            return new ValidationResult(false, "Caracter ilegal");
        }
        else
        {
            return new ValidationResult(true, null);
        }
    }
}
    
asked by Mulflar 14.10.2016 в 12:21
source

0 answers