2

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

例如,如果该属性的值为 1,我们应该更改一个 View 按钮的背景颜色,如果值为 2,我们应该隐藏一个Label并将 a 的文本加粗TextBox,如果值为 14,我们应该隐藏 2 Labels

由于可以在构建应用程序后确定这些值,因此我们想要一个文件,一个在运行时加载的带有反射的程序集,或者任何指定在视图上必须做什么而不部署整个应用程序的东西。

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

您认为是否有更好的方法来满足要求?对视图所做的更改将始终只是几个属性。

提前致谢。

4

2 回答 2

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/

于 2013-09-06T13:18:24.313 回答
0

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

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

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

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

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

if (YourIntProperty == 1) ButtonBackground = Brushes.Red;
else if (YourIntProperty == 2) IsLabelVisible = false;
else ...
于 2013-09-06T13:11:59.250 回答