Неявный WPT DataTemplate, объявленный в App.xaml, не вступит в силу - PullRequest
1 голос
/ 05 июля 2011

В 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 во время разработки, как указано выше), но оно победило ' t работать - MainWindow не использует DataTemplate, установленный в App.xaml.

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

Ответы [ 2 ]

4 голосов
/ 05 июля 2011

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

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

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

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

Это создает один элемент контента в вашем окне.DataTemplates работают, сопоставляя content с новым View - в этом случае, поскольку здесь Content - это 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>
4 голосов
/ 05 июля 2011

Я думаю, что вам нужно

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

EDIT:

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

<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.

...