将WPF属性绑定到C#中的ApplicationSettings的最佳方法?

将WPF属性绑定到C#中的ApplicationSettings的最佳方法是什么? 是否有像Windows窗体应用程序中的自动方式? 类似于这个问题 ,你怎样(也有可能)在WPF中做同样的事情?

您可以直接绑定到由Visual Studio创build的静态对象。

在你的Windows声明中添加:

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

其中UserSettings是应用程序名称空间。

然后你可以添加一个绑定到正确的设置:

 <TextBlock Height="{Binding Source={x:Static p:Settings.Default}, Path=Height, Mode=TwoWay}" ....... /> 

现在,您可以保存设置,例如closures应用程序时的示例:

 protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { Properties.Settings.Default.Save(); base.OnClosing(e); } 

我喜欢被接受的答案,但我遇到了一个特例。 我把我的文本框设置为“只读”,这样我就可以只在代码中改变它的值。 我不明白为什么值不传播到设置,虽然我有模式为“双向”。

然后,我发现这个: http : //msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx

缺省值是Default,它将返回目标依赖项属性的默认UpdateSourceTrigger值。 但是,大多数依赖属性的默认值是PropertyChanged,而Text属性的默认值是LostFocus

因此,如果具有IsReadOnly =“True”属性的文本框,则必须将UpdateSourceTrigger = PropertyChanged值添加到Binding语句中:

 <TextBox Text={Binding Source={x:Static p:Settings.Default}, Path=myTextSetting, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} ... /> 

如果你是一个VB.Net开发人员试图这样做,答案是smidge不同。

 xmlns:p="clr-namespace:ThisApplication" 

注意.Properties不在那里。


在你的绑定它的MySettings.Default,而不是Settings.Default – 因为app.config存储它不同。

 <TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ... 

拉了一下我的头发后,我发现了这一点。 希望能帮助到你

最简单的方法是绑定到一个对象,该对象将您的应用程序设置作为属性公开或将该对象包含为StaticResource并绑定到该对象。

你可以采取的另一个方向是创build你自己的标记扩展,所以你可以简单地使用PropertyName =“{ApplicationSetting SomeSettingName}”。 要创build自定义标记扩展,您需要inheritanceMarkupExtension并使用MarkupExtensionReturnType属性修饰类。 John Bowen 在创build自定义的MarkupExtension方面有一个post ,可能会使这个过程更加清晰。

克里斯,我不确定这是绑定ApplicationSettings的最好方法,但这是我在Witty中做的 。

1)为要绑定在窗口/页面/用户控件/容器中的设置创build一个依赖项属性。 这是我有一个用户设置播放声音的情况。

  public bool PlaySounds { get { return (bool)GetValue(PlaySoundsProperty); } set { SetValue(PlaySoundsProperty, value); } } public static readonly DependencyProperty PlaySoundsProperty = DependencyProperty.Register("PlaySounds", typeof(bool), typeof(Options), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnPlaySoundsChanged))); private static void OnPlaySoundsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { Properties.Settings.Default.PlaySounds = (bool)args.NewValue; Properties.Settings.Default.Save(); } 

2)在构造函数中,初始化属性值以匹配应用程序设置

  PlaySounds = Properties.Settings.Default.PlaySounds; 

3)绑定XAML中的属性

  <CheckBox Content="Play Sounds on new Tweets" x:Name="PlaySoundsCheckBox" IsChecked="{Binding Path=PlaySounds, ElementName=Window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

您可以下载完整的Witty源代码来查看它,或者只浏览选项窗口的代码 。

我喜欢通过ViewModel来完成,只需在XAML中正常执行绑定即可

  public Boolean Value { get { return Settings.Default.Value; } set { Settings.Default.SomeValue= value; Settings.Default.Save(); Notify("SomeValue"); } } 

另请阅读这篇文章,了解它是如何在BabySmash中完成的

如果您需要更改通知,您只需要使用DO(如Alan的示例)备份设置! 绑定到POCO设置类也将工作!