在WPF中,我如何绑定到app.config中configSections中的设置
本文关键字:app config configSections 设置 绑定 WPF 何绑定 | 更新日期: 2023-09-27 17:59:26
我们是一家由三个人组成的WPF小商店(C#/WPF/.NET 4.0 CP),我们每个人对WPF都还相对陌生(经验不到一年)。我们的应用程序有很多内部全局常量,比如背景色、画笔、像素宽度、工具提示字符串,我们希望将它们移到app.config文件中。
同时,我希望能够在xaml中直接绑定到这些app.config值。这可能吗?
我已经知道你可以访问这里定义的琐碎的键/值对:
<appSettings>
<add key="TextBlockHeight" value="50"/>
</appSettings>
通过将命名空间添加到xaml
xmlns:p="clr-namespace:SampleApp.Properties"
然后在主体中引用
<TextBlock
Height="{Binding Source={x:Static p:Settings.Default}, Path=TextBlockHeight}" />
直到今天我才知道这种能力,但它对我来说是有意义的
xmlns:p="clr-namespace:SampleApp.Properties"
生成Properties对象的人员和内容?为什么绑定引用设置默认?什么是默认值?"设置"对象上是否有其他属性?
除此之外,我们的应用程序非常复杂,我想做两件事:
1.使用配置部分根据我们自己的内部模块来分离我们的可配置值
看起来可能是这样的:
<configSections>
<sectionGroup name="Qst2ConfigGroup">
<section name="Qst2Settings" type="WinWam6.Qst2ConfigSection, WW6-WPF" />
</sectionGroup>
</configSections>
...
<Qst2Settings
LoadQst2Async = "true"
AutoDisplayFirstQst2Insp = "true"
AllowQst2ParallelLoad = "true"
AllowMultiThread = "true"
ShowNodeData = "true"
ShowAllFailNotes = "true"
ShowAllRules = "true"
ShowAllValues = "true"
TwipsPerPixelX = "15.0"
TwipsPerPixelY = "15.0" />
2.能够将配置部分从主应用程序传递到DLL中。DLL将实现一些报告功能,我们从过去的经验中知道,我们需要这些配置参数的运行时值。
我现在不太关心#2,而更感兴趣的是#1。有没有这样的说法:
<Checkbox
IsChecked="{Binding Source={x:Static p:Settings.Qst2ConfigGroup}, Path=Qst2Settings.LoadQst2Async}" />
请注意,我已经处理过了,WinWam6.Qst2ConfigSection确实有一个支持类。我只是不确定我在这里走对了路。
创建应用程序或库时,可以看到一个"Properties"文件夹。在此文件夹中,将有资源.resx和设置.Settings。当您引用xmlns:p="clr-namespace:SampleApp.Properties"
时,它实际上会返回此文件夹中的内容。在Settings.Designer.cs中,您可以找到此处定义的带有静态属性"默认"的"SampleApp.Properties.Settings"。这是您想要了解的有关默认的信息。
所以,实际上,您现在使用的是在Settings.Settings中定义的,而不是在App.Config中。如果要使用App.Config中的键/值对,则需要使用System.Configuration.ConfigurationSettings.AppSettings
。但它们都是键/值对,您不能在XAML中如此容易地使用它。您可能需要为其添加一个TypeConverter。
当您向程序添加设置时,它会将默认值添加到app.config&它将具有该名称的属性添加到Settings.Designer.cs中定义的类中。您需要了解以下几点:
- Settings类是静态的。你不能实例化它的一个实例
- 您不能在app.config中更改应用程序设置的值
- 用户设置可以更改,但不能在app.config中更改。用户设置将写入用户配置文件文件夹中的文件。app.config只保存默认值
我会为设置创建一个视图模型类。该类将实现INotifyPropertyChanged
,并且每个设置都有一个可以修改的属性。每个设置属性的getter将从Settings.Default
中检索该属性的值。setter将设置属性&引发CCD_ 5事件。表单上的保存/确定按钮将保存更改。
例如,如果我们有一个名为RootDir
的用户设置,它看起来像这样:
public class UserSettings : INotifyPropertyChanged {
public string RootDir {
get { return Settings.Default.RootDir; }
set {
Settings.Default.RootDir = value;
OnPropertyChanged( "RootDir" );
}
public event PropertyChangedEventHandler PropertyChanged;
public OnPropertyChanged( string property ) {
PropertyChangedEventHandler h = PropertyChanged;
if ( h != null ) {
h(property);
}
}
}
}
然后,您可以添加一个RoutedCommand
来保存对用户配置文件的更改。
我在Windows窗体应用程序(VB.NET)中有一个WPF UserControl。我不确定这是否与问题中的情况类似。我可以在设计时通过将WPF用户控件上的DataContext设置为My.Settings来绑定用户控件中的控件。这在XAML中显示如下:
<UserControl.DataContext>
<My:MySettings/>
</UserControl.DataContext>
然后,当我在WPF/XAML中绑定控件的属性时,它会显示我所有的应用程序设置。