Возможно ли применить DataTemplate к странице? - PullRequest
4 голосов
/ 22 февраля 2010

Я пытаюсь следовать схеме MVVM, изложенной здесь: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090097 У меня есть это в моем файле MainWindowResources.xaml:

<DataTemplate DataType="{x:Type vm:VendorsViewModel}">
        <vw:Vendors/>  <--- I get a "Can't put a page in a style" error in blend with this
</DataTemplate>

и у меня есть это в моем файле MainWindow.xaml

<Window.Resources>
     <ResourceDictionary Source="MainWindowResources.xaml"/>
</Window.Resources>

Файл mainWindow.xaml содержит меню слева и держатель страницы справа. Могу ли я применить шаблон данных к <Page>? Или это должен быть <UserControl>? В нынешнем виде ничто не связано с данными, вот что у меня есть на странице, к которой я хочу применить viewmodel:

<Custom:DataGrid Margin="0,30,0,0" d:LayoutOverrides="Width" ItemsSource="{Binding Path=AllVendors, Mode=Default}" >
     <Custom:DataGrid.Columns>
    <Custom:DataGridTextColumn Header="Company Name" Binding="{Binding Path=Name}" />
    </Custom:DataGrid.Columns>
</Custom:DataGrid>

1 Ответ

3 голосов
/ 22 февраля 2010

Шаблоны данных применяются к Контенту, который в большинстве случаев является либо свойством Контента ContentControl, либо свойством Items / ItemsSource ItemsControl. Страница не является производной от ContentControl (UserControl), поэтому шаблон DataTemplate нельзя применить к его содержимому.

Из того, что вы делаете здесь, не похоже, что вы пытаетесь это сделать. Похоже, вы пытаетесь использовать страницу в DataTemplate, о чем говорит ошибка. Страница обрабатывается как Window в том смысле, что это корневой контейнер, предназначенный для визуального содержимого, определенного в файле xaml. UserControl имеет аналогичную цель, но может быть вставлен в любом месте макета. Если вы измените vw: Vendors на UserControl, который должен избавиться от этой конкретной ошибки, но вам также следует подумать, получаете ли вы что-то от использования UserControl, а не просто помещаете его содержимое непосредственно в DataTemplate - это может помочь не поощрять код. позади и заставит вас правильно использовать вашу ViewModel.

...