繁体   English   中英

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

[英]Sharing views between similar WPF applications

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

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

视图:

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

查看模型:

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM