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

Kri*_*son 48 .net c# wpf visual-studio

在C#中将WPF属性绑定到ApplicationSettings的最佳方法是什么?是否有像Windows窗体应用程序一样的自动方式?与此问题类似,您如何(并且可能)在WPF中执行相同的操作?

Sac*_*tin 103

您可以直接绑定到Visual Studio创建的静态对象.

在你的windows声明中添加:

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

UserSettings应用程序命名空间在哪里.

然后,您可以将绑定添加到正确的设置:

<TextBlock Height="{Binding Source={x:Static p:Settings.Default}, 
           Path=Height, Mode=TwoWay}" ....... />
Run Code Online (Sandbox Code Playgroud)

现在,您可以在关闭应用程序时按照示例保存设置:

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    Properties.Settings.Default.Save();
    base.OnClosing(e); 
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那里的搜索者来说,*TwoWay*是必需的,否则设置将不会被保存.很烦人试图想出那一个. (10认同)
  • 有关略有不同的语法(以及良好的介绍),请阅读http://blogs.msdn.com/b/patrickdanino/archive/2008/07/23/user-settings-in-wpf.aspx (4认同)
  • 虽然这是对问题的一个很好的答案,但我发现绑定对于编辑设置的工具/选项对话框样式来说并不是正确的答案; 在用户单击"确定"按钮之前,您不希望将窗口小部件值复制到属性.使用显式代码在OK单击处理程序中执行此操作意味着取消按钮根本不需要处理程序IsCancel == true (3认同)
  • 我很惊讶"TwoWay"绑定实际上在两个方面都有效.尼斯.+1 (2认同)

小智 9

如果你是一个尝试这个的VB.Net开发人员,答案是不同的.

xmlns:p="clr-namespace:ThisApplication"
Run Code Online (Sandbox Code Playgroud)

请注意.Properties不存在.


在你的绑定中它是MySettings.Default,而不是Settings.Default - 因为app.config以不同的方式存储它.

<TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ...
Run Code Online (Sandbox Code Playgroud)

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


Rem*_*mus 7

我喜欢接受的答案,但我碰到了一个特例.我将我的文本框设置为"只读",以便我只能在代码中更改它的值.我无法理解为什么这个值没有传播回设置,尽管我将模式设为"TwoWay".

然后,我发现了这个: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} ... />
Run Code Online (Sandbox Code Playgroud)


Ric*_*lay 5

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

您可以采取的另一个方向是创建自己的标记扩展,这样您就可以使用PropertyName ="{ApplicationSetting SomeSettingName}".要创建自定义标记扩展,您需要继承MarkupExtension并使用MarkupExtensionReturnType属性修饰该类.John Bowen 发表了一篇关于创建自定义MarkupExtension的文章,可能会让这个过程更加清晰.