绑定到“设置”中定义的值


78

在WPF中,可以将绑定与“设置”中定义的值一起使用吗?如果可能的话,请提供样本。

Answers:


130

首先,您需要添加一个自定义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}" />

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


注:由于所指出的@Daniel和@nabulke,不要忘记设置访问修饰符设置文件来Public范围,以User


11
我发现只有在将设置文件标记为公共访问修饰符的情况下,此方法才有效。shortfastcode.blogspot.com/2009/12/…–
丹尼尔(Daniel)

5
为了使用保存值MyApp.Properties.Settings.Default.Save(),必须将设置范围设置为User
nabulke,2012年

31

上面的解决方案确实有效,但是我觉得它很冗长...您可以改用自定义标记扩展,可以这样使用:

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

这是此扩展的代码:

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;
    }
}

此处有更多详细信息:http : //www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/


1
这是一个很好的扩展,但是不幸的是,您失去了Resharper的智能感知能力。不值得取舍恕我直言,尽管应该指出,我是一个无可救药的R#迷:)
Ohad Schneider

确实是@OhadSchneider。我用ReSharper的自己,但很少为XAML,因为我并不觉得不如在C#...
托马斯莱维斯克

8

@CSharper的答案不适用于我用VB.NET编码的WPF应用程序(不是C#,显然不像其他WPF应用程序的99.999%),因为我遇到一个持续的编译器错误,抱怨SettingsMyApp.Properties命名空间中找不到,这不会继续即使重建也可以。

经过大量的在线搜索之后,对我而言有效的是改为使用local应用程序主窗口XAML文件中默认创建的XAML命名空间:

<Window
    <!-- Snip -->
    xmlns:local="clr-namespace:MyApp"
    <!-- Snip -->
><!-- Snip --></Window>

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

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

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

MySettings.Default.Save()

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

(灵感来自于此Visual Studio论坛帖子;请参阅Muhammad Siddiqi的回复。)


0

这是我绑定UserSettings的方法:

通过键入生成一个依赖变量propdp,然后两次制表。

    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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.