¿Cómo obtener una colección de valores List de app.config en WPF?

El siguiente ejemplo completa ItemsControl con una lista de directorios de copia de seguridad que obtengo del código.

¿Cómo puedo cambiar esto para obtener la misma información del archivo app.config?

XAML:

                

código detrás:

 using System.Collections.Generic; using System.Windows; using System.Configuration; using System.ComponentModel; namespace TestReadMultipler2343 { public partial class Window1 : Window, INotifyPropertyChanged { #region ViewModelProperty: Title private string _title; public string Title { get { return _title; } set { _title = value; OnPropertyChanged("Title"); } } #endregion #region ViewModelProperty: BackupDirectories private List _backupDirectories = new List(); public List BackupDirectories { get { return _backupDirectories; } set { _backupDirectories = value; OnPropertyChanged("BackupDirectories"); } } #endregion public Window1() { InitializeComponent(); DataContext = this; Title = ConfigurationManager.AppSettings.Get("title"); GetBackupDirectoriesInternal(); } void GetBackupDirectoriesInternal() { BackupDirectories.Add(@"C:\test1"); BackupDirectories.Add(@"C:\test2"); BackupDirectories.Add(@"C:\test3"); BackupDirectories.Add(@"C:\test4"); } void GetBackupDirectoriesFromConfig() { //BackupDirectories = ConfigurationManager.AppSettings.GetValues("backupDirectories"); } #region INotifiedProperty Block public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } #endregion } } 

app.config:

     <!--     -->   

Puede crear su propia sección de configuración personalizada en el archivo app.config. Hay bastantes tutoriales para comenzar. En definitiva, podrías tener algo como esto:

  

Para complementar la respuesta de Richard, este es el C # que podría usar con su configuración de muestra:

 using System.Collections.Generic; using System.Configuration; using System.Xml; namespace TestReadMultipler2343 { public class BackupDirectoriesSection : IConfigurationSectionHandler { public object Create(object parent, object configContext, XmlNode section) { List myConfigObject = new List(); foreach (XmlNode childNode in section.ChildNodes) { foreach (XmlAttribute attrib in childNode.Attributes) { myConfigObject.Add(new directory() { location = attrib.Value }); } } return myConfigObject; } } public class directory { public string location { get; set; } } } 

Luego puede acceder a la sección de configuración de backupDirectories de la siguiente manera:

 List dirs = ConfigurationManager.GetSection("backupDirectories") as List; 

Podría tenerlos delimitados por punto y coma en un solo valor, por ejemplo

App.config

  

DO#

 var paths = new List(ConfigurationManager.AppSettings["paths"].Split(new char[] { ';' })); 

En realidad, hay una clase muy poco conocida en el BCL para este propósito: CommaDelimitedStringCollectionConverter . Sirve como una especie de término medio entre tener una ConfigurationElementCollection (como en la respuesta de Richard) y analizar la cadena usted mismo (como en la respuesta de Adam).

Por ejemplo, podría escribir la siguiente sección de configuración:

 public class MySection : ConfigurationSection { [ConfigurationProperty("MyStrings")] [TypeConverter(typeof(CommaDelimitedStringCollectionConverter))] public CommaDelimitedStringCollection MyStrings { get { return (CommaDelimitedStringCollection)base["MyStrings"]; } } } 

A continuación, podría tener un app.config que se parece a esto:

    

Finalmente, su código se vería así:

 var section = (MySection)ConfigurationManager.GetSection("foo"); foreach (var s in section.MyStrings) Console.WriteLine(s); //for example 

Me encanta la respuesta de Richard Nienaber, pero como Chuu señaló, realmente no dice cómo lograr lo que Richard se refiere como una solución. Por lo tanto, he decidido proporcionarle la forma en que terminé haciendo esto, terminando con el resultado del que Richard está hablando.

La solución

En este caso, estoy creando un widget de saludo que necesita saber qué opciones tiene para recibir. Esta puede ser una solución sobre ingeniería para la pregunta de OP, ya que también estoy creando un contenedor para posibles widgets futuros.

Primero configuré mi colección para manejar los diferentes saludos

 public class GreetingWidgetCollection : System.Configuration.ConfigurationElementCollection { public List All { get { return this.Cast().ToList(); } } public GreetingElement this[int index] { get { return base.BaseGet(index) as GreetingElement; } set { if (base.BaseGet(index) != null) { base.BaseRemoveAt(index); } this.BaseAdd(index, value); } } protected override ConfigurationElement CreateNewElement() { return new GreetingElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((GreetingElement)element).Greeting; } } 

Luego creamos el elemento de saludo acutal y su interfaz

(Puede omitir la interfaz, así es como siempre lo hago).

 public interface IGreeting { string Greeting { get; set; } } public class GreetingElement : System.Configuration.ConfigurationElement, IGreeting { [ConfigurationProperty("greeting", IsRequired = true)] public string Greeting { get { return (string)this["greeting"]; } set { this["greeting"] = value; } } } 

La propiedad greetingWidget para que nuestra configuración comprenda la colección

Definimos nuestra colección GreetingWidgetCollection como el ConfigurationProperty greetingWidget ConfigurationProperty para que podamos usar “greetingWidget” como nuestro contenedor en el XML resultante.

 public class Widgets : System.Configuration.ConfigurationSection { public static Widgets Widget => ConfigurationManager.GetSection("widgets") as Widgets; [ConfigurationProperty("greetingWidget", IsRequired = true)] public GreetingWidgetCollection GreetingWidget { get { return (GreetingWidgetCollection) this["greetingWidget"]; } set { this["greetingWidget"] = value; } } } 

El XML resultante

        ...      

Y lo llamarías así

 List greetings = Widgets.GreetingWidget.All; 

Tenía el mismo problema, pero lo resolvió de una manera diferente. Puede que no sea la mejor solución, pero es una solución.

en app.config:

   

Luego, en mi clase contenedora de configuración, agrego un método para buscar claves.

  public List SearchKeys(string searchTerm) { var keys = ConfigurationManager.AppSettings.Keys; return keys.Cast() .Where(key => key.ToString().ToLower() .Contains(searchTerm.ToLower())) .Select(key => ConfigurationManager.AppSettings.Get(key.ToString())).ToList(); } 

Para cualquiera que lea esto, estoy de acuerdo en que crear su propia sección de configuración personalizada es más limpio y más seguro, pero para proyectos pequeños, donde necesita algo rápido, esto podría resolverlo.

En App.config:

  

Cª#:

 string[] InFormOfStringArray = ConfigurationManager.AppSettings["YOURKEY"].Split(',').Select(s => s.Trim()).ToArray(); List list = new List(InFormOfStringArray);