在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确实有一个支持类。我只是不确定我在这里走对了路。

在WPF中,我如何绑定到app.config中configSections中的设置

创建应用程序或库时,可以看到一个"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中定义的类中。您需要了解以下几点:

  1. Settings类是静态的。你不能实例化它的一个实例
  2. 您不能在app.config中更改应用程序设置的值
  3. 用户设置可以更改,但不能在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中绑定控件的属性时,它会显示我所有的应用程序设置。