在 WPF 中清理“设置”绑定

Posted

技术标签:

【中文标题】在 WPF 中清理“设置”绑定【英文标题】:Clean "settings" binding in WPF 【发布时间】:2014-04-05 02:50:20 【问题描述】:

我最近在 XAML 中处理我的配置设置的大量绑定。存储列宽/控件大小/窗口位置等。所以我想知道是否有一种简单的方法可以创建并将“设置/配置”值绑定到 XAML?

现在我只是在项目中创建一个设置,将一个可绑定属性推入 XAML 的 DataContext 并从那里开始。但是我的设置计数变得非常疯狂,管理它们变得越来越痛苦(无聊、重复和烦人)。

在一个理想的世界里,我想要一个可以做这样的事情的系统:

<Window State=Binding Settings Name="MyWindowState", DefaultValue="Normal"/>

如果“MyWindowState”设置不存在,它将自动创建并存储在某处。如果 MyWindowState 设置发生变化,所有使用它的绑定也会得到通知并相应地更新。如果设置检索失败,将使用 DefaultValue。

是否已经存在类似的东西,或者可以使用标准 WPF XAML 实现吗?

我正计划开发一些可以做到这一点的东西,但如果已经存在经过验证的解决方案,我希望至少看看/听到它。

据我了解,Telerik's persistance framework 可以做这样的事情,除了在控制到控制的基础上(没有我可以绑定的全局“设置”),至少乍一看。

【问题讨论】:

您可能会发现这很有用:thomaslevesque.com/2008/11/18/… @PeterRitchie 那是那里的 1/3,但我想避免手动去在项目本身中创建一个设置(这样我可以在其他项目中重用我的控件无需担心缺少设置),同时更新所有命中配置属性的绑定(如果它发生更改)。 据我了解,您有一个设置文件,该文件存储与您的窗口 xaml 文件相同的信息。在 xaml 中,您还可以设置宽度、位置、内容..等等,所以问题是为什么要复制 xaml?为什么不在启动时将 xaml 的构建操作更改为内容并在运行时加载 xaml 文件,或者在应用程序关闭事件时将当前窗口元素状态保存回 xaml? xaml 只不过是 xml,只是带有允许自定义标签的自定义解析 @devhedgehog 我没有在 XAML 文件中存储任何内容,目前我正在使用 .NET 内置项目设置来存储数据。哪个有效,但就像我说的那样,处理大量设置变得非常烦人。 什么意思你不在 xaml 文件中存储任何东西?当然,你做了你的窗口,所有元素都在 xaml 文件中,否则你不会在 wpf 中:) 我说不是让 .net 在 baml 中编译你的 xaml,你可以选择保持原始 xaml 并在运行时加载它将允许您操作您的 xaml 文件 :) 这种方法将导致您的设置文件在 xaml 中全部消失 :) 【参考方案1】:

您可以使用附加属性执行此操作:

<Window loc:WindowState.Name="MyWindowState" />

在附加属性的 OnNameChanged 事件处理程序中,您将可以访问设置了 WindowState.Name 属性的 Window 实例并访问值 ("MyWindowState" in此示例)已设置。在那里,您开始监听(例如,使用 PropertyChangedEventManager)对您的 Window 实例的所有属性的更改,这些属性是您想要保留的窗口状态的一部分。

【讨论】:

【参考方案2】:

也许您可以使用 WPF 的主题选项。您可以将控件的设置(宽度、颜色...)存储在主题文件中,该文件只不过是一个 xml 文件。您可以将此 xml 存储在某处并在运行时加载它。当应用程序因更改而退出时,您可以更新此 xml。并在应用程序下次打开时加载它。

【讨论】:

【参考方案3】:

是的,很有可能。如果你有一个应用程序属性文件,你可以这样访问它:

Height="Binding MainWindowHeight, Mode=TwoWay, Source=x:Static p:Settings.Default"

MainWindowHeight 是一个设置(在我的例子中是一个 int)。您还需要将其包含在 XAML 文件顶部的 WindowUserControl 标记中:

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

其中 APPLICATION_NAME 是您的应用程序的名称。

编辑:绑定可以有任何模式,我只使用 TwoWay 所以我不需要任何实际代码来更新它。对于我的窗户的定位,这种方式效果很好。

编辑:另外,这不能动态创建设置。我会在您的应用程序中使用 XML 文件,创建一个类来处理它,然后绑定到该类的方法以获取/动态创建值。

【讨论】:

以上是关于在 WPF 中清理“设置”绑定的主要内容,如果未能解决你的问题,请参考以下文章

DataTemplate WPF 中样式设置器中的绑定

如何通过数据绑定设置 WPF 超链接的文本?

WPF Bind设置了Source还需要对绑定控件的Content进行设置吗?

使用多重绑定设置c#wpf组合框背景颜色[关闭]

WPF 窗口位置绑定

设置绑定到 WPF 用户控件内的自定义 DependencyProperty