如何根据某些配置对WPF View进行轻微修改

时间:2013-09-06 11:59:04

标签: c# wpf user-interface mvvm runtime

我们有一个MVVM应用程序和一个要求说明(示例简化),基于一个int属性的值,我们应该对View进行一些修改。

例如,如果属性的值为1,我们应该更改一个View按钮的背景颜色,如果值为2,我们应该隐藏一个Label并以粗体显示{{1}的文本如果值为14,我们应隐藏2 TextBox

由于可以在构建应用程序之后决定值,我们希望在运行时使用反射加载程序集,或者在不部署整个应用程序的情况下指定必须在视图上执行的操作。

主要思想是创建View,在所有可用项上放置一个名称,并将其传递给在运行时加载的程序集中定义的类,该程序集将知道如何处理View。我们在这种方法中遇到的问题是您需要为View上的所有内容定义名称。

您认为有更好的方法来满足要求吗?在View上进行的更改将始终只是一些属性。

提前致谢。

2 个答案:

答案 0 :(得分:1)

@vitaliyzadorozhnyy建议的解决方案实际上是可行的。我们定期这样工作。我们加载一个xaml文件,它只是一个xml文件,操作xml文件,然后使用

渲染一个xaml控件
XamlReader.Parse(TemplateString);

在你的情况下,虽然我认为这不是最好的解决方案。根据您需要支持的WPF版本,您最好使用VisualStateManager

一般而言,您首先定义一系列VisualStates,然后调用:

VisualStateManager.GoToState(control, "stateName", useTransition);

根据您的int值转到所需的配置。

请注意,您需要使用WPF工具包才能正常工作。有一篇好文章: http://elijahm.ninjuro.com/2012/01/04/visual-states-in-wpf-4-0/

答案 1 :(得分:0)

好的,我已经考虑过了......而不是保留对所有相关控件(非常MVVM)的引用,你如何使用{{1}更新这些控件}?我有一个大规模的应用程序,在其中,我有一个名为Bindings的类,它管理应用程序的全局状态。此类使用StateManager模式,其实例在我的基本视图模型类中定义。这意味着我可以从任何视图模型访问其所有属性,因此可以访问任何视图。

我想如果你有一个类似的类,你可以在那里为你想要影响的每个控件放置一个属性。例如,您可以设置Singleton属性,以便显示或隐藏各种控件(使用bool)。您可以拥有更改BoolToVisibilityConverter属性所需的控件的Brush属性。您可以在其中添加Background属性,并根据其值设置每个属性。

在UI中,您可以从每个控件绑定到此类中的属性:

int

在课堂上,您可以更新值:

<Button Content="Click" Background="{Binding ConfigurationManager.ButtonBackground}" />
<Label Content="Read" Visibility="{Binding ConfigurationManager.IsLabelVisible, 
    Converter={StaticResource BoolToVisibilityConverter}}" />