绑定到设置中定义的值

Posted

技术标签:

【中文标题】绑定到设置中定义的值【英文标题】:Bind to a value defined in the Settings 【发布时间】:2010-10-25 02:34:21 【问题描述】:

在 WPF 中,我可以对设置中定义的值使用绑定吗?如果可以,请提供样本。

【问题讨论】:

【参考方案1】:

首先,您需要添加一个自定义 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 - How to bind a control to a property defined in the Settings?


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

【讨论】:

我发现这个方法只有在设置文件被标记为公共访问修饰符的情况下才有效。 shortfastcode.blogspot.com/2009/12/… 为了使用MyApp.Properties.Settings.Default.Save()保存值,设置范围必须设置为用户【参考方案2】:

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

<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/

【讨论】:

这是一个很棒的扩展,但不幸的是你失去了 Resharper intellisense。恕我直言,不值得权衡取舍,尽管应该指出我是一个绝望的 R# 粉丝 :) @OhadSchneider,确实如此。我自己使用 ReSharper,但很少用于 XAML,因为我觉得它不如 C#...【参考方案3】:

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

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

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

...并通过它使用以下内容绑定到我的设置(其中MyBooleanSetting 是我在我的项目属性中定义的Boolean 类型和范围用户的设置,具有默认的朋友访问修饰符):

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

为确保实际保存设置,请务必调用

MySettings.Default.Save()

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

(感谢Visual Studio forum post 的灵感;请参阅 Muhammad Siddiqi 的回复。)

【讨论】:

【参考方案4】:

这是我绑定 UserSettings 的方法:

通过键入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();

【讨论】:

以上是关于绑定到设置中定义的值的主要内容,如果未能解决你的问题,请参考以下文章

绑定到父数据上下文(超出 itemssource)

Kendo UI:如何使用 MVVM 绑定设置工具提示的值

如何在 Autodesk Revit Architecture 2010 中使用类型绑定设置共享参数的值?

KendoUI:将视图模型绑定到数据源更改

如何记录 Hibernate 绑定到准备好的语句的值?

将实数值绑定到 Grails 域属性(Dojo 小部件发送的值)