Я потратил несколько дней, пытаясь выяснить, что здесь не работает, и я подозреваю, что это более серьезная ошибка в 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
будет показано ...