在WPF中如何绑定app.config中configSections中的设置?

时间:2014-04-22 00:11:12

标签: c# wpf visual-studio-2010 xaml visual-studio-2013

我们是一个很小的三人WPF商店(C#/ WPF / .NET 4.0 CP),我们每个人仍然相对较新的WPF(不到一年的经验)。我们的应用程序有很多内部的全局常量 - 比如背景颜色,画笔,像素宽度,工具提示字符串 - 我们想要移动到app.config文件。

同时,我希望能够在xaml中直接绑定到这些app.config值。这可能吗?

我已经知道您可以访问此处定义的普通键/值对:

<appSettings>
    <add key="TextBlockHeight" value="50"/>
</appSettings>

将命名空间添加到xaml

的xmlns:P =&#34; CLR-名称空间:SampleApp.Properties&#34;

然后在正文中引用

<TextBlock
    Height="{Binding Source={x:Static p:Settings.Default}, Path=TextBlockHeight}" />
直到今天我才知道任何这种功能,但这对我来说很有意义。我没有找到任何东西是对这引用的内容的清晰描述

xmlns:p="clr-namespace:SampleApp.Properties"

生成属性对象的人和内容是什么?为什么Binding引用设置。默认?什么是默认的? Settings对象上可以有其他属性吗?

除此之外,我们的应用程序非常复杂,我想做两件事:

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的支持类。我只是不确定我是否会沿着正确的大道走下去。

2 个答案:

答案 0 :(得分:0)

创建应用程序或库时,您可以看到&#34;属性&#34;夹。在此文件夹中,将有Resouces.resx和Settings.settings。 当您引用xmlns:p="clr-namespace:SampleApp.Properties"时,它实际上会返回此文件夹中的内容。查看Settings.Designer.cs,您可以找到&#34; SampleApp.Properties.Settings&#34;这里定义的是静态属性&#34; 默认&#34; 。这是您想要了解的默认

因此,实际上您现在使用的是在Settings.settings中定义的,而不是在App.Config中定义的。 如果要在App.Config中使用键/值对,则需要使用System.Configuration.ConfigurationSettings.AppSettings。但它们都是键/值对,你不能轻易地在XAML中使用它。您可能需要为其添加TypeConverter。

答案 1 :(得分:0)

当您向程序添加设置时,它会将默认值添加到app.config&amp;它将具有该名称的属性添加到Settings.Designer.cs中定义的类。您需要了解一些事项:

  1. “设置”类是静态的。您无法实例化它的实例。
  2. 您无法在app.config中更改应用程序设置的值。
  3. 可以更改用户设置,但不能在app.config中更改。用户设置将写入用户配置文件文件夹中的文件。 app.config只保存默认值。
  4. 我会为设置创建一个视图模型类。该类将实现INotifyPropertyChanged,并且每个可以修改的设置都有一个属性。每个设置属性的getter将从Settings.Default检索属性的值。设定者将设置属性&amp;举起PropertyChanged事件。表单上的“保存/确定”按钮将保存更改。

    例如,如果我们有一个名为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以保存对用户个人资料的更改。