C# 在相似的WPF应用程序之间共享视图

C# 在相似的WPF应用程序之间共享视图,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在使用两个WPF应用程序,它们共享相同的代码库并执行基本相同的功能。ApplicationA面向超级用户,包含我们支持的每项功能的所有功能。ApplicationB更像是一个最终用户工具——它看起来基本相同,但为了让事情尽可能简单,一些更高级的功能对用户隐藏起来 这两个工具中有很多视图几乎相同,唯一的区别是我们在ApplicationB中隐藏了一些控件。这些视图非常相似,因此没有必要为每个工具维护单独的副本。我们的viewmodels知道它们运行在哪个应用程序中,因此我们目前通过将视图元素的

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

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

视图:

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


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

我认为您的思路是正确的。将属性更改为
PowerUserMode
怎么样。我认为视图模型负责告诉视图是否应该为高级用户呈现自己。视图仍然可以使用将控件上的
可见性
属性绑定到
PowerUserMode
属性


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

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

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


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

听起来您应该整合两者,只需跟踪谁是超级用户,谁是最终用户。如果我走这条路线,我也会把财产推上继承链。。。使用该属性(以及跨多个控件/窗口可能需要的任何其他属性)创建BaseViewModel或某些此类类型。这是我的初始计划(在我们的BaseViewModel中放置bool或enum属性并使用转换器)。
<SomeControl Visibility="{Binding Path=WhichApp}"> ...
public Visibility WhichApp
{
    get
    {
        if (GetApp() == Apps.ApplicationB) return Visibility.Collapsed;
        else return Visibility.Visible;
    }
}
public bool PowerUserMode
{
    get
    {
        return GetApp() != Apps.ApplicationB;
    }
}