Привязать DataTemplate к проблеме CustomControl - PullRequest
2 голосов
/ 24 июня 2011

У меня есть пользовательский элемент управления, который реализует табличку данных в xaml:

<DataTemplate x:Key="Templat">
    <StackPanel>
        <TextBlock Text="Sample Text" />
        <TextBlock Text="{Binding Surname}" />
    </StackPanel>
</DataTemplate>

и пользовательский контроль:

 <local:MyControl x:Name="MyControl1" 
      ItemTemplate="{StaticResource Templat}" Margin="0,0,-24,8"/>

generic.xaml (в моей библиотеке пользовательских элементов управления) имеет:

<ControlTemplate TargetType="local:MyControl">
   <Canvas Name="LayoutRoot" Height="{TemplateBinding Height}" 
           Width="{TemplateBinding Width}" 
           Background="{TemplateBinding Background}" 
           CacheMode="BitmapCache">

      <Canvas Name="ItemsHost" Margin="10,185,0,0" Height="615" 
              Width="{TemplateBinding Width}" CacheMode="BitmapCache">
           <local:CustomItem x:Name="Item1" 
                  ContentTemplate="{TemplateBinding ItemTemplate}" />
           <local:CustomItem x:Name="Item2" 
                  ContentTemplate="{TemplateBinding ItemTemplate}" />
      </Canvas>  
   </Canvas> 
</ControlTemplate> 

Что я делаю не так?

Я создал пользовательский элемент управления, в котором есть несколько пользовательских элементов управления содержимым. Я хочу, чтобы у них всех был один и тот же шаблон контента, поэтому я привязал их шаблон контента к определенной шаблоне элемента в родительском элементе управления.

Моя проблема заключается в том, что элементы управления будут отображать текстовый блок с текстом «Образец текста», но не тот, который имеет значение в привязке. Я пытался указать DataContext в codebehind (например, DataContext = new Person() { Surname="Johnson" } или через xaml. Ни один из них не сработал.

DataContext (класс Person) выглядит так, как будто он был передан правильно, но переданный DataTemplate пропускает выражение '{Binding Surname}'. У вас есть идеи, что может быть не так?

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

DataContext элементов управления в DataTemplate не наследуется от его родителя. Так что в вашем случае все в Templat будет иметь иной DataContext, чем CustomItem и MyControl.

DataContext для DataTemplate происходит из свойства Content связанного ContentControl или ContentPresenter. Так что в вашем случае, если вы сделали это:

<local:CustomItem x:Name="Item1" Content="{Binding}" ContentTemplate="{TemplateBinding ItemTemplate}" />

Тогда вы можете установить DataContext MyControl, и он будет передан в ваш DataTemplate.

Судя по всему, ваш MyControl должен быть ItemsControl, хотя (как объяснено здесь ).

1 голос
/ 24 июня 2011

Когда я писал пользовательские элементы управления, использующие шаблоны данных, мне приходилось писать код в своих пользовательских элементах управления, чтобы привязать шаблон к модели. Если первый ответ не работает для вас, проверьте этот ресурс:

http://chris.59north.com/post/Using-DataTemplates-in-custom-controls.aspx

...