/ / Vincular DataTemplate ao problema de controle personalizado - wpf, silverlight, vinculação de dados, controles personalizados, datatemplate

Vincular DataTemplate ao problema CustomControl - wpf, silverlight, vinculação de dados, controles personalizados, datatemplate

O que tenho é um controle personalizado, que implementa datatemplate no xaml:

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

e controle personalizado:

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

generic.xaml (em minha biblioteca de controle personalizado) tem:

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

O que estou fazendo de errado?

Eu criei um controle de item personalizado, que tem algunscontroles de conteúdo personalizado dentro. Quero que todos tenham o mesmo modelo de conteúdo, portanto, limitei seu modelo de conteúdo a itemtemplate definido no controle pai.

Meu problema é que os controles mostrarão o bloco de texto com o texto "Texto de amostra", mas não aquele com o valor vinculado. Eu estava tentando especificar DataContext no codebehind (como DataContext = new Person() { Surname="Johnson" } ou via xaml. Nenhum deles funcionou.

O DataContext (classe Person) parece que foi passado corretamente, mas o DataTemplate não "{Binding Surname}" expressão. Você tem alguma ideia do que pode estar errado?

Respostas:

4 para resposta № 1

O DataContext dos controles no DataTemplate não é herdado de seu pai. Portanto, no seu caso, tudo no Templat terá um DataContext diferente de CustomItem e MyControl.

O DataContext para o DataTemplate vem da propriedade Content do ContentControl ou ContentPresenter associado. Então, no seu caso, se você fez isso:

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

Em seguida, você pode definir o DataContext de MyControl, e ele seria passado para o seu DataTemplate.

Pelo que parece, o seu MyControl deve ser um ItemsControl (conforme explicado Aqui).


1 para resposta № 2

Quando escrevi controles personalizados que usam dadosmodelos, eu tive que escrever código em meus controles personalizados para vincular o modelo ao modelo. Se a primeira resposta não funcionar para você, verifique este recurso:

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