WPF의 app.config 에서 값 목록 모음 을 가져오는 방법은 무엇입니까?
다음 예제에서는 코드에서 가져온 백업 디렉터리 목록으로 ItemsControl을 채웁니다.
app.config 파일에서 동일한 정보를 가져오려면 어떻게 해야 합니까?
XAML:
<Window x:Class="TestReadMultipler2343.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition Width="160"/>
</Grid.ColumnDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Text="Title:"/>
<TextBlock
Grid.Row="0"
Grid.Column="1"
Text="{Binding Title}"/>
<TextBlock
Grid.Row="1"
Grid.Column="0"
Text="Backup Directories:"/>
<ItemsControl
Grid.Row="1"
Grid.Column="1"
ItemsSource="{Binding BackupDirectories}"/>
</Grid>
</Window>
코드백:
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<string> _backupDirectories = new List<string>();
public List<string> 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:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="title" value="Backup Tool" />
<!--<add key="backupDirectories">
<add value="C:\test1"/>
<add value="C:\test2"/>
<add value="C:\test3"/>
<add value="C:\test4"/>
</add>-->
</appSettings>
</configuration>
예를 들어 세미콜론을 단일 값으로 구분할 수 있습니다.
App.config
<add key="paths" value="C:\test1;C:\test2;C:\test3" />
C#
var paths = new List<string>(ConfigurationManager.AppSettings["paths"].Split(new char[] { ';' }));
app.config 파일에 사용자 지정 구성 섹션을 만들 수 있습니다.시작하는 데 도움이 되는 많은 튜토리얼이 있습니다.궁극적으로 다음과 같은 것을 얻을 수 있습니다.
<configSections>
<section name="backupDirectories" type="TestReadMultipler2343.BackupDirectoriesSection, TestReadMultipler2343" />
</configSections>
<backupDirectories>
<directory location="C:\test1" />
<directory location="C:\test2" />
<directory location="C:\test3" />
</backupDirectories>
Richard의 답변을 보완하기 위해 샘플 구성에 사용할 수 있는 C#입니다.
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<directory> myConfigObject = new List<directory>();
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; }
}
}
그런 다음 다음과 같이 백업 디렉터리 구성 섹션에 액세스할 수 있습니다.
List<directory> dirs = ConfigurationManager.GetSection("backupDirectories") as List<directory>;
저는 리차드 니나버의 대답을 좋아하지만, 추가 지적했듯이, 그것은 리처드가 해결책으로 언급하고 있는 것을 어떻게 달성해야 하는지를 정말로 말해주지 않습니다.그러므로 저는 리처드가 말한 결과로 마무리하면서, 제가 이 일을 하게 된 방법을 여러분에게 제공하기로 결정했습니다.
해결책
이 경우 인사말 위젯이 어떤 옵션에서 인사말을 해야 하는지 알아야 합니다.가능한 미래 위젯을 위한 컨테이너도 만들고 있기 때문에 OPs 질문에 대한 오버엔지니어링 솔루션일 수 있습니다.
먼저 다른 인사말을 처리하도록 컬렉션을 설정합니다.
public class GreetingWidgetCollection : System.Configuration.ConfigurationElementCollection
{
public List<IGreeting> All { get { return this.Cast<IGreeting>().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;
}
}
그런 다음 실제 인사 요소와 인터페이스를 만듭니다.
(인터페이스는 생략해도 됩니다. 항상 그렇게 하고 있습니다.)
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; }
}
}
greetingWidget 속성은 구성이 컬렉션을 이해할 수 있도록 합니다.
컬렉션을 정의합니다.GreetingWidgetCollection
처럼ConfigurationProperty
greetingWidget
결과 XML에서 "greetingWidget"을 컨테이너로 사용할 수 있습니다.
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; }
}
}
결과 XML
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<widgets>
<greetingWidget>
<add greeting="Hej" />
<add greeting="Goddag" />
<add greeting="Hello" />
...
<add greeting="Konnichiwa" />
<add greeting="Namaskaar" />
</greetingWidget>
</widgets>
</configuration>
그리고 당신은 그것을 이렇게 부를 것입니다.
List<GreetingElement> greetings = Widgets.GreetingWidget.All;
실제로 BCL에는 이 목적을 위해 거의 알려지지 않은 클래스가 있습니다. 바로 콤마DelimitedStringCollectionConverter입니다.그것은 그것을 갖는 것 사이의 일종의 중간점 역할을 합니다.ConfigurationElementCollection
(Richard의 대답에서처럼) 문자열을 직접 구문 분석합니다(Adam의 대답처럼).
예를 들어 다음 구성 섹션을 작성할 수 있습니다.
public class MySection : ConfigurationSection
{
[ConfigurationProperty("MyStrings")]
[TypeConverter(typeof(CommaDelimitedStringCollectionConverter))]
public CommaDelimitedStringCollection MyStrings
{
get { return (CommaDelimitedStringCollection)base["MyStrings"]; }
}
}
그런 다음 다음과 같은 app.config를 만들 수 있습니다.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="foo" type="ConsoleApplication1.MySection, ConsoleApplication1"/>
</configSections>
<foo MyStrings="a,b,c,hello,world"/>
</configuration>
마지막으로 코드는 다음과 같습니다.
var section = (MySection)ConfigurationManager.GetSection("foo");
foreach (var s in section.MyStrings)
Console.WriteLine(s); //for example
같은 문제가 있었지만 다른 방법으로 해결했습니다.최선의 해결책은 아닐 수도 있지만, 해결책입니다.
app.config:
<add key="errorMailFirst" value="test@test.no"/>
<add key="errorMailSeond" value="krister@tets.no"/>
그런 다음 구성 래퍼 클래스에서 검색 키에 메서드를 추가합니다.
public List<string> SearchKeys(string searchTerm)
{
var keys = ConfigurationManager.AppSettings.Keys;
return keys.Cast<object>()
.Where(key => key.ToString().ToLower()
.Contains(searchTerm.ToLower()))
.Select(key => ConfigurationManager.AppSettings.Get(key.ToString())).ToList();
}
이 문서를 읽는 모든 사용자는 사용자 지정 구성 섹션을 만드는 것이 더 깨끗하고 안전하다는 데 동의하지만, 빠른 작업이 필요한 소규모 프로젝트의 경우 이를 통해 해결될 수 있습니다.
App.config에서:
<add key="YOURKEY" value="a,b,c"/>
C#에서:
string[] InFormOfStringArray = ConfigurationManager.AppSettings["YOURKEY"].Split(',').Select(s => s.Trim()).ToArray();
List<string> list = new List<string>(InFormOfStringArray);
에서 목록을 가져오는 할 때 이 했습니다.appsettings.json
.
{
"foo": {
"bar": [
"1",
"2",
"3"
]
}
}
여기서 다음과 같이 작업할 수 있습니다.
Configuration.GetSection("foo:bar").Get<List<string>>()
출처:
https://stackoverflow.com/a/42296371/3850405
질문 감사합니다.하지만 저는 이 문제에 대한 저만의 해결책을 찾았습니다.처음에, 나는 방법을 만들었습니다.
public T GetSettingsWithDictionary<T>() where T:new()
{
IConfigurationRoot _configurationRoot = new ConfigurationBuilder()
.AddXmlFile($"{Assembly.GetExecutingAssembly().Location}.config", false, true).Build();
var instance = new T();
foreach (var property in typeof(T).GetProperties())
{
if (property.PropertyType == typeof(Dictionary<string, string>))
{
property.SetValue(instance, _configurationRoot.GetSection(typeof(T).Name).Get<Dictionary<string, string>>());
break;
}
}
return instance;
}
그런 다음 이 방법을 사용하여 클래스의 인스턴스를 생성했습니다.
var connStrs = GetSettingsWithDictionary<AuthMongoConnectionStrings>();
다음 수업 선언이 있습니다.
public class AuthMongoConnectionStrings
{
public Dictionary<string, string> ConnectionStrings { get; set; }
}
설정을 App.config에 저장합니다.
<configuration>
<AuthMongoConnectionStrings
First="first"
Second="second"
Third="33" />
</configuration>
언급URL : https://stackoverflow.com/questions/1779117/how-to-get-a-liststring-collection-of-values-from-app-config-in-wpf
'programing' 카테고리의 다른 글
MongoDB에서 커서란 무엇입니까? (0) | 2023.05.16 |
---|---|
Bash에서 변수로 정의된 숫자 범위에서 반복하는 방법은 무엇입니까? (0) | 2023.05.16 |
최근 커밋에 대해서만 GitHub에서 꺼내기 요청 전송 (0) | 2023.05.11 |
C#의 부분 수업은 나쁜 디자인입니까? (0) | 2023.05.11 |
Xcode 6의 AutoLayout 제약조건을 사용한 애스펙트 핏 거동 에뮬레이션 (0) | 2023.05.11 |