Неявный WPT DataTemplate, объявленный в App.xaml, не вступит в силу

В MainWindow.xamlЯ установил:

<Window.DataContext>
  <vm:MainViewModel/>
</Window.DataContext>

в App.xaml файл, я добавил следующее:

<Application.Resources>
  <DataTemplate DataType="vm:MainViewModel">
    <v:MainView/>
  </DataTemplate>
</Application.Resources>

Я надеялся MainWindow автоматически загрузит и покажет MainView с этими DataContext свойство, установленное для окна (которое было установлено в MainViewModel во время разработки, как указано выше), но это не сработает - MainWindow не использует DataTemplate установить в App.xaml,

Есть лучшие идеи для этого сценария?

2 ответа

Решение

Вы должны внести незначительные изменения -

Сначала в вашем окне. Попробуй это:

<Window>
  <!-- setup window... -->

  <ContentPresenter>
      <ContentPresenter.Content>
          <vm:MainViewModel/>
      </ContentPresenter.Content>
  </ContentPresenter>      
</Window>

Это создает один элемент контента в вашем окне. DataTemplates работают, отображая содержимое в новое представление - в данном случае, так как здесь содержимое MainViewModel, он будет автоматически создавать и создавать новые MainView для тебя. Настройка DataContext не сработает DataTemplates, поскольку вы никогда не делаете ViewModel "контентом" объекта.

Вы можете сократить это, просто установив содержимое окна напрямую, если вы предпочитаете:

<Window>
  <Window.Content>
    <vm:MainViewModel/>
  </Window.Content>
</Window>

Или даже связывание Контента с DataContext (хотя это имеет смысл, только если вам нужно DataContext установить для какой-то другой цели):

<Window Content="{Binding}">
  <Window.DataContext>
    <vm:MainViewModel/>
  </Window.DataContext>
</Window>

Я думаю тебе нужно

<DataTemplate DataType="{x:Type vm:MainViewModel}">

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

Я действительно не думаю, что я не прав, код

<Window.DataContext>
    <WpfApplication1:ViewModel />
</Window.DataContext>
<Window.Resources>
    <DataTemplate DataType="{x:Type WpfApplication1:ViewModel}">
        <TextBlock>Custom template</TextBlock>
    </DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding}" />

показывает "Пользовательский шаблон". Если я удалю x:Typeвместо этого показано "WpfApplication1.ViewModel", который является результатом вызова ToString() на вид модель объекта. Это используется в отсутствие DataTemplate,

Другие вопросы по тегам