如何从XAML内部访问嵌套名称空间?

时间:2019-11-14 12:40:48

标签: c# wpf xaml

我有一个包含2个项目的WPF应用程序,一个用于ViewModels(MyApp.Core),另一个用于Views(MyApp)。

在视图和视图模型内部,我有不同的嵌套名称空间(例如:MyApp.Core.ViewModels.Example1)。

我想在App.xaml中注册我的Views和ViewModels,并使用DataTemplates将ViewModels绑定到Views。

我目前所拥有的是:

<Application
   x:Class="MyApp"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:example1v="clr-namespace:MyApp.Views.Example1"
   xmlns:example1vm="clr-namespace:MyApp.Core.ViewModels.Example1;assembly=MyApp.Core"
   xmlns:example2v="clr-namespace:MyApp.Views.Example1"
   xmlns:example2vm="clr-namespace:MyApp.Core.ViewModels.Example1;assembly=MyApp.Core"
   StartupUri="Views/MainWindow.xaml">

   <Application.Resources>
       <DataTemplate DataType="{x:Type example1vm:Example1ViewModel}">
           <example1v:Example1Window />
       </DataTemplate>
       <DataTemplate DataType="{x:Type example2vm:Example2ViewModel}">
           <example2v:Example2Window />
       </DataTemplate>
   </Application.Resources>
</Application>

如您所见,我为每个嵌套名称空间都有一个名称空间,随着应用程序的增长,这个名称空间会越来越大。

我的问题是:是否可以只导入基本名称空间,然后在XAMl标记中指定更多方法?

我在想这样的事情:

<Application
   x:Class="MyApp"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:v="clr-namespace:MyApp.Views"
   xmlns:vm="clr-namespace:MyApp.Core.ViewModels;assembly=MyApp.Core"
   StartupUri="Views/MainWindow.xaml">

   <Application.Resources>
       <DataTemplate DataType="{x:Type vm:Example1.Example1ViewModel}">
           <v:Example1.Example1Window />
       </DataTemplate>
       <DataTemplate DataType="{x:Type vm:Example2.Example2ViewModel}">
           <v:Example2.Example2Window />
       </DataTemplate>
   </Application.Resources>
</Application>

1 个答案:

答案 0 :(得分:3)

来自x:Type Markup Extension

  

<object property="{x:Type prefix:typeNameValue}" .../>

     

prefix可选。映射非默认XAML命名空间的前缀。通常不需要指定前缀。请参阅备注。

     

typeNameValue是必需的。可解析为当前默认XAML命名空间的类型名称;或指定的映射前缀(如果提供了prefix)。

一个快速测试表明,typeNameValue中的复合名称实际上是可行的-因为它显然可以对名称空间前缀进行解析-尽管XAML设计器可能会抱怨嵌套类型不是支持。

namespace DataTypeNamespaceTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new Test.ViewModel();
        }
    }
}

namespace DataTypeNamespaceTest.Test
{
    public class ViewModel
    {
        public string Text { get; } = "Text in Test.ViewModel";
    }
}

XAML:

<Window x:Class="DataTypeNamespaceTest.MainWindow"
        xmlns:local="clr-namespace:DataTypeNamespaceTest"
        ...>
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:Test.ViewModel}">
            <TextBlock Padding="10" Background="Aqua" Text="{Binding Text}"/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ContentControl Content="{Binding}"/>
    </Grid>
</Window>
相关问题