我有以下xaml代码:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding MainWindow, Source={StaticResource Locator}}">
<Window.Resources>
<DataTemplate DataType="{x:Type vm:KeyboardViewModel}">
<vw:Keyboard />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:WelcomeViewModel}">
<vw:Welcome />
</DataTemplate>
</Window.Resources>
<DockPanel>
<DockPanel>
<ContentControl Content="{Binding Path=Workspace}" />
</DockPanel>
</DockPanel>
</Window>
当Workspace是KeyboardViewModel时,会显示UserControl键盘。当“工作区”为“欢迎”时,将显示“欢迎”屏幕。但是当我测试我用Moq模拟ViewModels时。然后,Workspace获取类型IKeyboardViewModelProxyxxxxxxxxxxxxx(其中xxxxxxx是随机字符串),它不映射到DataTemplate中的KeyboardViewModel,而WPF现在不希望DataTemplate显示。 当我使用真正的KeyboardViewModel时,没问题。 我可以以某种方式修复它,还是我必须重新设计它?
答案 0 :(得分:1)
我遇到了类似的问题(但不使用Moq)。我使用的PARTIAL解决方案是从抽象的KeyboardViewModelAbstract继承KeyboardViewModel和KeyboardViewModelMock。然后你可以这样做:
<DataTemplate DataType="{x:Type vm:KeyboardViewModelAbstract}">
<vw:Keyboard />
</DataTemplate>
哪个适用于真实模型对象和模拟。
不幸的是,当您处理已经具有基类或涉及任何类型继承的模型时,此解决方案无法扩展。如果DataTemplate可以与接口一起使用,我会很棒,但它们不能。
答案 1 :(得分:0)
您可以省略DataType="{x:Type vm:KeyboardViewModel}"
。如果你这样做,它不会期望一个类型为KeyboardViewModel的实例再绑定,而只是一个只包含模板中使用的所有属性的任何类型的对象。