У меня есть следующие ControlTemplate
:
<ContentControl Content="{Binding ContentViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type viewModel:FilledContentViewModel}">
<usercontrols:FilledMainWindow x:Name="MainContent" />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:EmptyContentViewModel}">
<!-- todo: Something like a StartPage here -->
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
Это прекрасно работает до тех пор, пока модель представления не попытается изменить свойство ContentViewModel
с одного FilledContentViewModel
на новое FilledContentViewModel
, после чего содержимое ContentControl
не обновляется. При переключении с EmptyContentViewModel
на FilledContentViewModel
или наоборот работает.
Конечно, простое обновление всего существующего FilledContentViewModel
было бы одним из решений. Но я думаю, что это может быстро запутаться, и что просто создать новый ViewModel
с правильным контекстом и переключить его было бы более элегантно.
Кто-нибудь знает способ обновить содержимое DataTemplate
?
Loaded
событииFilledMainWindow
? Или вы используете одноразовые привязки, которые хотите обновить? - person Brannon   schedule 01.01.2016FilledMainWindow
данным и будет реагировать соответствующим образом, если вы измените егоDataContext
с одногоFilledContentViewModel
на другое? - person dkozl   schedule 01.01.2016Content
на другойFilledContentViewModel
, он изменитDataContext
и переоценитContentTemplate
и снова установит его наDataTemplate
дляFilledContentViewModel
, но для WPF это тот же шаблон, поэтому это не изменение, поэтому он не будет воссоздавать пользовательский элемент управления, и фактически изменится только егоDataContext
. Проблема угадывания где-то здесь. - person dkozl   schedule 01.01.2016Loaded
дляFilledMainWindow
, и я также не использую одноразовые привязки в рассматриваемом проекте. - person Dima   schedule 02.01.2016FilledMainWindow
напрямую (не через DataTemplate) и сообщу вам результат. - person Dima   schedule 02.01.2016ContentControl
просто ищет DataType, и если он все тот же, и реагирует только на изменение DataType. В этом проектеFilledContentViewModel
получает класс отображения ORM (с использованием Dapper). Итак, если во время выполнения открывается другая база данных, я подумал, что будет проще изменить путь к базе данных в классе картографа и внедрить его в новыйFilledContentViewModel
вместо того, чтобы обновлять все в существующем. - person Dima   schedule 02.01.2016ContentControl
, который я разместил в вопросе, на<usercontrols:FilledMainWindow DataContext="{Binding ContentViewModel}" x:Name="MainContent" />
. И тогда переключениеFilledContentViewModel
объектов сработало как положено. Проблема в том, что DataTemplate для EmptyContentViewModel, где я хочу разместить что-то вроде стартовой страницы в будущем, теперь отклонен. - person Dima   schedule 02.01.2016