WPF: UserControl не отображается во время разработки внутри Datatemplate для ContentControl - PullRequest
0 голосов
/ 23 апреля 2020

Я потратил несколько дней, пытаясь выяснить, что здесь не работает, и я подозреваю, что это более серьезная ошибка в VS или что-то простое, что я наблюдаю ...

У меня есть ContentControl, который обслуживает модель представления:

<!-- Learning control from DataTemplate -->
<ContentControl Content     = "{Binding learningViewModel}"
                Grid.Row    = "1"
                Grid.Column = "1"
                Height      = "300"
                Margin      = "20, 0, 0, 0"/>

Свойство, с которым оно связано, на самом деле является интерфейсом с набором моделей представления.

Тогда у меня есть определение DataTemplate для возможного ViewModels:

<Window.Resources>

    <DataTemplate DataType="{x:Type vm:vmLearnSpeak}">
        <local:viewLearnSpeak CommandNotKnown           = "{Binding DataContext.cmdNotKnown,                RelativeSource={RelativeSource AncestorType=local:wndSession}}"
                              CommandAlmostKnown        = "{Binding DataContext.cmdAlmostKnown,             RelativeSource={RelativeSource AncestorType=local:wndSession}}"
                              CommandKnown              = "{Binding DataContext.cmdKnown,                   RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:vmLearnWrite}">
        <local:viewLearnWrite CommandNotKnown           = "{Binding DataContext.cmdNotKnown,                RelativeSource={RelativeSource AncestorType=local:wndSession}}"
                              CommandAlmostKnown        = "{Binding DataContext.cmdAlmostKnown,             RelativeSource={RelativeSource AncestorType=local:wndSession}}"
                              CommandKnown              = "{Binding DataContext.cmdKnown,                   RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:vmLearnListen}">
        <local:viewLearnListen CommandNotKnown          = "{Binding DataContext.cmdNotKnown,                RelativeSource={RelativeSource AncestorType=local:wndSession}}"
                               CommandAlmostKnown       = "{Binding DataContext.cmdAlmostKnown,             RelativeSource={RelativeSource AncestorType=local:wndSession}}"
                               CommandKnown             = "{Binding DataContext.cmdKnown,                   RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
    </DataTemplate>

</Window.Resources>

Во время выполнения программы привязка работает должным образом.

Однако во время разработки ContentControl будет отображать только простую строку, представляющую путь модели представления (например, . " MyApp.ViewModels.vmLearnSpeak ").

Все модели представлений имеют конструкторы по умолчанию, которые инициализируют некоторые фиктивные данные, и если я изменяю эту фиктивную инициализацию в ViewModel, у которой есть свойство ContentControl привязан, тогда DataTemplate также изменяется в конструкторе, как и ожидалось (например, строка меняется на " MyApp.ViewModels.vmLearnWrite ").

Если я заменю DataTemplate со При использовании другого элемента управления, например кнопки, кнопка отображается, если установлено соответствующее значение Data для DataTemplate с кнопкой.

В общем, DataTemplate в основном работает.

Работают и пользовательские элементы управления: если я поместил код из DataTemplate непосредственно в макет, то элемент управления выглядит так, как ожидается.

Следовательно, кажется, что элемент управления не будет отображаться только во время разработки, если размещен внутри DataTemplate ...

Надеюсь, я предоставил достаточно информации, иначе дайте мне знать ... Заранее благодарю за поддержку!

Кстати: работает сообщество Visual Studio 2016 на всякий случай может быть известная ошибка (потратив так много времени на попытки исправить, я не уверен, но думаю, что раньше она работала некоторое время go ...)

РЕДАКТИРОВАТЬ:

Проблема действительно в UserControl, если я добавляю простую пустую или только с кнопкой UserControl, та же проблема есть. Однако, если я поставлю CustomControl или обычный Button, DataTemplate будет показано ...

...