Wpf 绑定到设置中定义的值

Wpf 绑定到设置中定义的值,wpf,binding,appsettings,Wpf,Binding,Appsettings,在WPF中,我可以对设置中定义的值使用绑定吗?如果可能,请提供一个示例。首先,您需要添加一个自定义XML命名空间,用于设计定义设置的命名空间: xmlns:properties="clr-namespace:TestSettings.Properties" 然后,在XAML文件中,使用以下语法访问默认设置实例: {x:Static properties:Settings.Default} 下面是最终结果代码: <ListBox x:Name="lb" ItemsSou

在WPF中,我可以对设置中定义的值使用绑定吗?如果可能,请提供一个示例。

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

xmlns:properties="clr-namespace:TestSettings.Properties"
然后,在XAML文件中,使用以下语法访问默认设置实例:

{x:Static properties:Settings.Default}
下面是最终结果代码:

<ListBox x:Name="lb"
         ItemsSource="{Binding Source={x:Static properties:Settings.Default},
                               Path=Names}" />

资料来源:



注:正如@Daniel和@nabulke所指出的,不要忘记将设置文件的访问修饰符设置为
Public
,将范围设置为
用户

上述解决方案确实有效,但我发现它相当冗长。。。您可以改为使用自定义标记扩展,其使用方式如下:

<ListBox x:Name="lb" ItemsSource="{my:SettingBinding Names}" />

这里有更多详细信息:

@CSharper的答案不适用于我用VB.NET编写的WPF应用程序(不是C#,显然与99.999%的其他WPF应用程序不同),因为我遇到了一个持续的编译器错误,抱怨在
MyApp.Properties
命名空间中找不到
设置,即使重建后也不会消失

在进行了大量在线搜索之后,对我有效的方法是使用默认情况下在我的应用程序的主窗口XAML文件中创建的
local
XAML名称空间:

<Window
    <!-- Snip -->
    xmlns:local="clr-namespace:MyApp"
    <!-- Snip -->
><!-- Snip --></Window>
要确保实际保存了设置,请务必调用

…代码隐藏中的某个位置(例如
Me.Closing
事件中的
MainWindow.xaml.vb
文件)


(灵感来源于此;请参阅穆罕默德·西迪奇的回复。)

以下是我如何绑定用户设置:

通过键入
propdp
生成依赖项变量,然后键入两次tab

    public UserSettings userSettings
    {
        get { return (UserSettings)GetValue(userSettingsProperty); }
        set { SetValue(userSettingsProperty, value); }
    }
    public static readonly DependencyProperty userSettingsProperty =
        DependencyProperty.Register("userSettings", typeof(UserSettings), typeof(MainWindow), new PropertyMetadata(UserSettings.Default));
现在,您可以通过以下方式绑定
userSettings

Value="{Binding userSettings.SomeUserSettingHere, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
并确保在更改用户设置或退出时通过以下方式保存用户设置:

UserSettings.Default.Save();

我发现这个方法只有在设置文件被标记为公共访问修改器时才有效。为了使用
MyApp.Properties.Settings.Default.save()
保存值,必须将设置范围设置为User。这是一个很好的扩展,但不幸的是,您丢失了Resharper intellisense。不值得这样做,尽管我是一个毫无希望的粉丝:)@OhadSchneider,真的。我自己使用ReSharper,但很少使用XAML,因为我发现它不如C#中的好。。。
    public UserSettings userSettings
    {
        get { return (UserSettings)GetValue(userSettingsProperty); }
        set { SetValue(userSettingsProperty, value); }
    }
    public static readonly DependencyProperty userSettingsProperty =
        DependencyProperty.Register("userSettings", typeof(UserSettings), typeof(MainWindow), new PropertyMetadata(UserSettings.Default));
Value="{Binding userSettings.SomeUserSettingHere, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
UserSettings.Default.Save();