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

本文关键字:之间 共享 视图 应用程序 WPF | 更新日期: 2023-09-27 18:25:25

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

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

视图:

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

视图模型:

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

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

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

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

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

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

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

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

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

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