WPF设计时间数据混乱

时间:2012-09-03 01:49:19

标签: wpf mvvm blendability

为什么当我为MVVM View创建一些设计时数据时,我必须将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.

这不允许我构建不同于其他错误。为什么是这样?我如何解决它?我还是习惯了这个设计时数据。

1 个答案:

答案 0 :(得分: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文件中使用它时,它必须知道该信息,即使它仅在设计时。 / p>

这是顺便说一下......这是在Visual Studio的xaml编辑器中。

enter image description here

这是一个错误问题的例子,这使得它成为一个让家务琐事的猜谜游戏。没有intellisense和东西,除非我重建清除错误,直到我再次搞砸了一些语法。它仍然可以作为设计时数据工作,所以我不知道是什么。

enter image description here

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