【问题标题】:WPF Design Time Data ConfusionWPF 设计时数据混乱
【发布时间】:2012-09-03 11:12:38
【问题描述】:

为什么当我为我的 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.

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

【问题讨论】:

  • 嗯...当我像在第二部分中那样将它托管在一个新的 xaml 文件中时,我不能拥有第二个 xmlns:local。这就是导致问题的原因。为什么在实际视图 xaml 中需要它,而不是在这个单独的 xaml 文件中?为什么会这样?
  • 仅供参考,最好将您的发现作为答案发布,而不是更新问题。感谢您的帖子。
  • 谢谢。我希望我仍然可以得到答案,为什么在“用户”类型中找不到属性“名称”错误仍然出现......但大部分问题至少得到了回答。我继续前进并将我的编辑作为答案。我对stackoverflow还是很陌生,所以请原谅我。

标签: wpf mvvm blendability


【解决方案1】:

好吧,在摆弄它之后,根据我上面的评论,我已经弄清楚了。它显然与视图 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 文件中看到“未找到属性 'Name'...”,但不再出现在视图的主 xaml 文件中。我觉得这很优雅。并且以这种方式......视图仍然完全不知道实际的 ViewModel 类型......而当我像以前一样在视图 xaml 文件中拥有它时,它必须知道该信息,即使它只是在设计时。

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

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

【讨论】:

  • 我得说,这样做有点令人沮丧。我正在尝试创建另一个设计时数据 xaml 文件......并且对象的范围不断进出......取决于这些错误是否存在。每次输入内容时,我都必须构建才能看到弹出的智能感知。有人知道这是为什么吗?
  • 这是 VS 中令人沮丧的情况之一,您必须卸载并重新加载项目。这种事情发生在我身上太多了,我希望有更好的方法来解决它。
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2013-02-13
相关资源
最近更新 更多