保持观点的最干净的方式'路径

时间:2015-12-23 20:46:09

标签: c# wpf mvvm global-variables modern-ui

我在项目中使用Modern UI。不幸的是,它的导航机制基于视图的绝对(或相对于项目目录)路径。 xaml文件。

示例窗口xaml

...
<mui:LinkGroup DisplayName="Menu">
    <mui:LinkGroup.Links>
    <mui:Link DisplayName="About"
          Source="/View/Pages/AboutView.xaml"/>
    <mui:Link DisplayName="Settings"
          Source="/View/Pages/SettingsView.xaml"/>
    <mui:Link DisplayName="Gallery"
          Source="/View/Pages/GalleryView.xaml"/>
    </mui:LinkGroup.Links>
</mui:LinkGroup>
...

背后的示例代码

string url = "/View/Pages/AboutView.xaml";
NavigationService nav = NavigationService.GetNavigationService(this);
nav.Navigate(new System.Uri(url, UriKind.RelativeOrAbsolute));

我喜欢重构很多,所以我不想依赖硬编码路径来源文件。我一直在想可能是一个全局字典式的结构,将类型typeof(XyzViewModel)映射到它们各自的路径是一个很好的想法(至少我把所有东西放在一个地方),但是又一次,singletons are evil。我不认为反思也是一个答案。

有没有办法处理这种情况而不诉诸反模式?

1 个答案:

答案 0 :(得分:1)

没有很多重构方法可以做到这一点。

您可以做的一件事是使用一个包含所有路径的常量类。

namespace MyApp.Shared 
{
    public static class NavigationConstants
    {
        public const string About = "/View/Page/AboutView.xaml";
    }
}

然后在代码后面而不是魔术字符串中使用它:nav.Navigate(new System.Uri(NavigationConstants.About, UriKind.RelativeOrAbsolute));

它不是单例模式,在解耦或单元测试方面不会妨碍。

在XAML方面,您可以使用Static关键字来映射路径。

   xmlns:shared="clr-namespace:MyApp.Shared"
...
<mui:LinkGroup DisplayName="Menu">
    <mui:LinkGroup.Links>
        <mui:Link DisplayName="About"
            Source="{x:Static shared:NavigationConstants.About}"/>
        <mui:Link DisplayName="Settings"
            Source="{x:Static shared:NavigationConstants.Settings}"/>
        <mui:Link DisplayName="Gallery"
            Source="{x:Static shared:NavigationConstants.Gallery}"/>
    </mui:LinkGroup.Links>
</mui:LinkGroup>