1

为什么当我为我的 MVVM 视图创建一些设计时数据时,我必须嵌套 xmlns 两次才能访问该属性的属性?

例子:

       <d:DesignProperties.DataContext>
            <local:UserListViewModel>
                <local:UserListViewModel.Users xmlns:local="clr-namespace:ChatModule.ViewModels">
                    <local:User Name="Person 1" />
                    <local:User Name="Person 2" />
                    <local:User Name="Person 3" />
                    <local:User Name="Person 4" />
                    <local:User Name="Person 5" />
                    <local:User Name="Person 6" />
                </local:UserListViewModel.Users>
            </local:UserListViewModel>
       </d:DesignProperties.DataContext>

我已经在 UserControl 的 xmlns 中定义了一个本地属性。但是要访问底层类中的 User 结构,我必须在 Users 属性中再次定义它。

这是为什么?

所有这一切都很好......我可以看到我的运行时数据非常棒。我以前从来没有这样做过,所以能够看到它很整洁。我注意到当我编译时我经常得到错误消失......但每当我更改 xaml 时都会再次出现。

The property 'Name' was not found in type 'User'.
The property 'Name' was not found in type 'User'.
The property 'Name' was not found in type 'User'.
The property 'Name' was not found in type 'User'.
The property 'Name' was not found in type 'User'.
The property 'Name' was not found in type 'User'.

显然它有效,否则我将无法看到运行时数据。

我还想将此设计时数据提取到另一个 xaml 类中,并在此类中引用它,因此我没有位于视图本身内的实际设计时数据……只是对另一个 xaml 文件的引用。

所以我这样做了......就像这样......

<UserListViewModel xmlns="clr-namespace:ChatModule.ViewModels">
    <UserListViewModel.Users xmlns:local="clr-namespace:ChatModule.ViewModels">
        <local:User Name="Person 1" />
        <local:User Name="Person 2" />
        <local:User Name="Person 3" />
        <local:User Name="Person 4" />
        <local:User Name="Person 5" />
        <local:User Name="Person 6" />
    </UserListViewModel.Users>
</UserListViewModel>

但是,当我摆脱代码隐藏时,我得到了上面提到的相同错误(在构建中消失),但还有一个错误说

Cannot set properties on propety elements. Line 2 Position 6.

与其他错误不同,这不允许我构建。为什么是这样?我如何解决它?我仍然习惯这种设计时数据的东西。

4

1 回答 1

3

好的,所以在摆弄它之后,根据我上面的评论,我已经弄清楚了。它显然与视图 xaml 的工作方式不同,因为我不需要指定 xmlns:local 两次来访问属性的属性。我不知道为什么会这样。

这是我的代码现在的样子。

在我的主要 xaml 中,我有这个:

<Grid Name="LayoutRoot" d:DataContext="{d:DesignData Source=DesignTimeData/UserListViewData.xaml}">
    <ListView ItemsSource="{Binding Users}" ItemTemplate="{StaticResource UserTemplate}"  VerticalContentAlignment="Center" HorizontalContentAlignment="Stretch" Background="#505050" >
    </ListView>
</Grid>

在单独的 xaml 文件中,我有这个:

<local:UserListViewModel xmlns:local="clr-namespace:ChatModule.ViewModels">
    <local:UserListViewModel.Users >
        <local:User Name="Person 1" />
        <local:User Name="Person 2" />
        <local:User Name="Person 3" />
        <local:User Name="Person 4" />
        <local:User Name="Person 5" />
        <local:User Name="Person 6" />
    </local:UserListViewModel.Users>
</local:UserListViewModel>

我仍然在支持的 xaml 文件中得到“找不到属性'名称'...”,但不再出现在视图的主 xaml 文件中。我觉得这很优雅。并且以这种方式......视图仍然完全不知道实际的 ViewModel 类型......而当我像以前一样在视图 xaml 文件中拥有它时,它必须知道该信息,即使它只是在设计时。

顺便说一句,这是在工作......这是在 Visual Studio 的 xaml 编辑器中。

在此处输入图像描述

这是错误问题的一个示例,这使得它成为一个让事情变得正确的苦差事猜谜游戏。除非我重建以清除错误,直到我再次弄乱一些语法,否则没有智能感知和其他东西。它仍然可以作为设计时数据正常工作,所以我不知道发生了什么。

在此处输入图像描述

http://i.imgur.com/jiVKm.jpg

于 2012-09-03T02:08:13.143 回答