绑定到"设置"中定义的值

72 wpf binding appsettings

在WPF中,我可以使用与"设置"中定义的值绑定吗?如果可以,请提供样品.

CSh*_*per 122

首先,您需要添加一个自定义XML命名空间,该命名空间将设计定义设置的命名空间:

xmlns:properties="clr-namespace:TestSettings.Properties"
Run Code Online (Sandbox Code Playgroud)

然后,在XAML文件中,使用以下语法访问默认设置实例:

{x:Static properties:Settings.Default}
Run Code Online (Sandbox Code Playgroud)

所以这是最终的结果代码:

<ListBox x:Name="lb"
         ItemsSource="{Binding Source={x:Static properties:Settings.Default},
                               Path=Names}" />
Run Code Online (Sandbox Code Playgroud)

来源:WPF - 如何将控件绑定到设置中定义的属性?


注意:正如@Daniel和@nabulke所指出的,不要忘记将设置文件的Access Modifier设置为PublicScope toUser

  • 我发现只有将设置文件标记为公共访问修饰符时,此方法才有效.http://shortfastcode.blogspot.com/2009/12/binding-to-settings-file.html (9认同)
  • 为了使用`MyApp.Properties.Settings.Default.Save()`保存值,必须将设置范围设置为**User**. (3认同)

Tho*_*que 29

上面的解决方案确实有效,但我发现它非常冗长......你可以使用自定义标记扩展,可以像这样使用:

<ListBox x:Name="lb" ItemsSource="{my:SettingBinding Names}" />
Run Code Online (Sandbox Code Playgroud)

以下是此扩展程序的代码:

public class SettingBindingExtension : Binding
{
    public SettingBindingExtension()
    {
        Initialize();
    }

    public SettingBindingExtension(string path)
        :base(path)
    {
        Initialize();
    }

    private void Initialize()
    {
        this.Source = WpfApplication1.Properties.Settings.Default;
        this.Mode = BindingMode.TwoWay;
    }
}
Run Code Online (Sandbox Code Playgroud)

更多细节:http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/

  • 这是一个很棒的扩展,但不幸的是你失去了 Resharper 智能感知。恕我直言,不值得权衡,但应该指出的是,我是一个无可救药的 R# 粉丝:) (2认同)

Chr*_*ton 8

@ CSharper的答案对我在VB.NET中编码的WPF应用程序不起作用(不是C#,不像其他WPF应用程序的99.999%),因为我得到一个持久的编译器错误抱怨SettingsMyApp.Properties命名空间中找不到,这不会发生即使在重建之后.

经过多次在线搜索后,对我来说有用的local是在我的应用程序的主窗口XAML文件中使用默认创建的XAML命名空间:

<Window
    <!-- Snip -->
    xmlns:local="clr-namespace:MyApp"
    <!-- Snip -->
><!-- Snip --></Window>
Run Code Online (Sandbox Code Playgroud)

...并使用类似下面的内容通过它绑定到我的设置(MyBooleanSetting我在我的项目属性类型Boolean和范围User中定义的设置,使用默认的Friend访问修饰符):

<CheckBox IsChecked="{Binding Source={x:Static local:MySettings.Default}, Path=MyBooleanSetting, Mode=TwoWay}"
          Content="This is a bound CheckBox."/>
Run Code Online (Sandbox Code Playgroud)

为确保实际保存设置,请务必致电

MySettings.Default.Save()
Run Code Online (Sandbox Code Playgroud)

...在你的代码隐藏的某个地方(例如Me.Closing你的MainWindow.xaml.vb文件).

(感谢这个Visual Studio论坛帖子的灵感;请参阅Muhammad Siddiqi的回复.)