在WPF中使用DataTemplate与模拟对象

时间:2010-09-21 11:45:07

标签: wpf data-binding xaml mocking moq

我有以下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时,没问题。 我可以以某种方式修复它,还是我必须重新设计它?

2 个答案:

答案 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的实例再绑定,而只是一个只包含模板中使用的所有属性的任何类型的对象。