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 № 1O 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