2014-10-02 106 views
1

我正在使用两个共享相同代码库并执行基本相同功能的WPF应用程序。 ApplicationA针对强大的用户,并包含我们支持的所有功能的所有功能。 ApplicationB更像是一个最终用户工具 - 它看起来基本相同,但为了尽可能简化事情,一些更高级的功能对用户是隐藏的。在类似的WPF应用程序之间共享视图

在这两个工具中有几乎相同的视图,唯一的区别是我们在ApplicationB中隐藏了一些控件。视图非常相似,因此为每个工具维护一个单独的副本是没有意义的。我们的视图模型知道它们正在运行哪个应用程序,所以我们目前通过将视图元素的可见性绑定到视图模型的属性来解决这个问题。

查看:

<SomeControl Visibility="{Binding Path=WhichApp}"> ... 

视图模型:

public Visibility WhichApp 
{ 
    get 
    { 
     if (GetApp() == Apps.ApplicationB) return Visibility.Collapsed; 
     else return Visibility.Visible; 
    } 
} 

我不喜欢的的ViewModels负责处理的知名度,这是几乎从定义视图的属性。这种方法也限制了我们的视图模型在这两种工具之外的可重用性。

我对任何替代解决方案感兴趣,这些解决方案将帮助我在两个项目之间共享视图,同时保持视图和视图模型之间的关注点分离。

+0

听起来像你应该巩固这两个,只是跟踪谁是权力用户和谁是最终用户。 – paqogomez 2014-10-02 16:20:30

回答

1

我同意,应用程序全局的东西不应包含在每个ViewModel(DRY)中。这种事情属于App.xaml中的静态资源(顺便说一句,这不是一种完成任何类型的全局设置的好方法,比如主题/皮肤,当前用户的权限/角色等)。

只需在App.xaml的Visibility类型的Application.Resources中创建一个静态资源,然后使用您现有的代码将其绑定到App.xaml中的代码隐藏。

现在,您有一次性计算和检索,众所周知的地方可以随处访问应用程序模式,您的视图模型不必重新发明轮子。

1

我认为你是在正确的轨道上。如何将该物业更改为PowerUserMode。我认为视图模型有责任告诉视图是否应该为高级用户呈现自己。视图仍然可以使用BooleanToVisibilityConverter将控件上的Visibility属性绑定到PowerUserMode属性。

public bool PowerUserMode 
{ 
    get 
    { 
     return GetApp() != Apps.ApplicationB; 
    } 
} 

如果你不喜欢的耦合GetApp()Apps类型,你可以只拥有财产由布尔备份,让一些其他类设置视图模型酌情PowerUserMode

+0

如果我要走这条路线,我还会将该属性推到继承链上......创建一个BaseViewModel或具有该属性的某种类型(以及您可能需要跨越多个控件/窗口的其他任何其他类型)。 – 2014-10-02 17:29:31

+0

这是我最初的计划(在我们的基础视图模型中使用bool或enum属性并使用转换器)。 – zmb 2014-10-02 17:32:28

相关问题