在类似的WPF应用程序之间共享视图

时间:2014-10-02 16:15:47

标签: c# wpf mvvm

我正在使用两个共享相同代码库并执行大致相同功能的WPF应用程序。 ApplicationA面向高级用户,包含我们支持的每个功能的所有功能。 ApplicationB更像是一个最终用户工具 - 它看起来基本相同,但是一些更高级的功能对用户是隐藏的,以使事情尽可能简单。

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

查看:

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

查看型号:

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

我不认为viewmodels负责处理可见性,这几乎是定义视图的属性。这种方法还限制了我们的视图模型在这两个工具之外的可重用性。

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

2 个答案:

答案 0 :(得分:1)

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

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

如果您不喜欢与GetApp()Apps类型的耦合,您可以让该属性由bool支持,并让其他类在视图上设置PowerUserMode适当的模型。

答案 1 :(得分:1)

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

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

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