c# - 在类似的 WPF 应用程序之间共享 View

标签 c# wpf mvvm

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

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

看法:

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

查看型号:
public Visibility WhichApp
{
    get
    {
        if (GetApp() == Apps.ApplicationB) return Visibility.Collapsed;
        else return Visibility.Visible;
    }
}

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

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

最佳答案

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

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

现在,您有一个一次性计算和检索的、众所周知的位置来访问应用程序模式,并且您的 View 模型不必重新发明轮子。

关于c# - 在类似的 WPF 应用程序之间共享 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26165025/

相关文章:

c# - 如何阻止 1 个解决方案启动您的所有网站?

c# - 如何使用具有自己入口点的 App.Xaml 的 ResourceDictionaries

silverlight - 从 DataTemplate 中的 DataTemplate 中引用 ViewModel DataContext

wpf - 应用于所有组合框选定项目的项目

c# - 如何在提交时显示 "success"消息?

c# - 使用 HttpClient 时记录请求/响应消息

c# - 无法绑定(bind)到 DataContext

wpf - 鼠标点击在 xaml 中的弹出菜单透明背景上丢失

c# - WPF-如何从 View 而不是viewmodel显示自定义异常

c# - MVC 发布数据并返回 json 数据