我们有一个MVVM应用程序和一个要求说明(示例简化),基于一个int属性的值,我们应该对View进行一些修改。
例如,如果属性的值为1,我们应该更改一个View按钮的背景颜色,如果值为2,我们应该隐藏一个Label
并以粗体显示{{1}的文本如果值为14,我们应隐藏2 TextBox
。
由于可以在构建应用程序之后决定值,我们希望在运行时使用反射加载程序集,或者在不部署整个应用程序的情况下指定必须在视图上执行的操作。
主要思想是创建View,在所有可用项上放置一个名称,并将其传递给在运行时加载的程序集中定义的类,该程序集将知道如何处理View。我们在这种方法中遇到的问题是您需要为View上的所有内容定义名称。
您认为有更好的方法来满足要求吗?在View上进行的更改将始终只是一些属性。
提前致谢。
答案 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}}" />