WPF中清除“设置”绑定

7

最近我在XAML中使用了很多与配置设置的绑定。存储列宽度/控件大小/窗口位置等等。所以我想知道是否有一种简单的方法来创建并绑定到“设置/配置”值到XAML?

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

在理想的情况下,我希望有一种系统,可以像这样做:

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

如果"MyWindowState"设置不存在,它将被自动创建并存储在某个地方。如果MyWindowState设置更改,使用它的所有绑定也将被通知并相应更新。如果设置检索失败,则将使用DefaultValue。
是否已经存在类似的解决方案,或者是否可以通过标准的WPF XAML实现?
我打算开发一个可以做到这一点的工具,但是如果已经有证明有效的解决方案,我至少想看看它/听听它的意见。
据我所了解,Telerik的持久化框架可以做到这样的事情,除了在控件之间进行控制(我不能绑定到全局的“设置”),至少初步看来是这样的。

1
你可能会发现这个链接有用:http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/ - Peter Ritchie
据我所了解,您有一个存储与窗口xaml文件相同信息的设置文件。在xaml中,您还可以设置宽度、位置、内容等等,那么问题是为什么要复制xaml呢?为什么不将xaml的构建操作更改为内容,并在启动时动态加载xaml文件,或在应用程序关闭事件上将当前窗口元素状态保存回xaml?xaml除了使用自定义解析器允许自定义标记外,其实就是xml。 - dev hedgehog
@devhedgehog,我没有在XAML文件中存储任何内容,目前我正在使用.NET内置的项目设置来存储数据。这很有效,但就像我说的那样,处理相当大量的设置变得非常烦人。 - xvpower
我在考虑使用某种数据库或可观察字典来代替设置(将它们包装在效果中),然后可以引用该数据库或字典而不是设置。嗯... - ouflak
我认为,我们可以将自定义设置存储在配置文件(例如App.config)中,并在代码后台进行检索过程,并使用StaticResource/DynamicResource绑定Binding概念。默认值将在代码后台中(作为属性的初始值),而不是XAML中(到目前为止我找不到其他替代方法)。 - Suriya
显示剩余4条评论
3个回答

1

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

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

其中MainWindowHeight是一个设置(在我的情况下,是一个整数)。你还需要将其包含在XAML文件的顶部,在WindowUserControl标记中:

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

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

编辑:绑定可以有任何模式,我只使用TwoWay,所以我不必有任何实际代码来更新它。对于我的窗口定位,这样做非常好。

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


0

或许你可以利用 WPF 的主题选项。你可以将控件的设置(宽度、颜色等)保存在一个主题文件中,这个文件其实就是一个 XML 文件。你可以将这个 XML 存储在某处,并在运行时加载它。当应用程序退出并发生更改时,可以更新此 XML。下次打开应用程序时再次加载它。


0
你可以使用附加属性来实现这个功能:
<Window loc:WindowState.Name="MyWindowState" />

在你的附加属性的OnNameChanged事件处理程序中,你将可以访问设置WindowState.Name属性的Window实例,并访问被设置的值(例如这个例子中的"MyWindowState")。在那里,你开始监听(例如使用PropertyChangedEventManager)你想要持久化的窗口状态中所有属性的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接