Используйте DataTemplate в WPF с макетом объекта - PullRequest
2 голосов
/ 21 сентября 2010

У меня следующий код 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. Когда рабочая область приветствуется, отображается экран приветствия. Но когда я тестирую, я высмеиваю ViewModels с Moq . Затем рабочая область получает тип IKeyboardViewModelProxyxxxxxxxxxxxxx (где xxxxxxx - случайная строка), который не отображается на KeyboardViewModel в DataTemplate, а WPF теперь не хочет, чтобы DataTemplate отображался. Когда я использую настоящую KeyboardViewModel, это не проблема. Могу ли я как-то это исправить, или мне нужно это переделать?

Ответы [ 2 ]

1 голос
/ 08 мая 2011

У меня похожая проблема (но без использования Moq). Частичное решение, которое я использовал, - это наследование KeyboardViewModel и KeyboardViewModelMock от абстрактного KeyboardViewModelAbstract. Тогда вы можете сделать:

<DataTemplate DataType="{x:Type vm:KeyboardViewModelAbstract}">
    <vw:Keyboard />
</DataTemplate>

Что будет работать как для реального объекта модели, так и для макета.

К сожалению, это решение не масштабируется, когда вы имеете дело с моделями, которые уже имеют базовый класс или имеют какое-либо наследование. Было бы здорово, если бы DataTemplate можно было использовать с интерфейсами, но они не могут.

0 голосов
/ 22 сентября 2010

Вы можете опустить DataType="{x:Type vm:KeyboardViewModel}".Если вы сделаете это, он не ожидает, что экземпляр типа KeyboardViewModel будет связываться с чем-либо, а только с объектом любого типа, который просто имеет все свойства, которые используются в шаблоне.

...