wpf data-binding datatemplate

datatemplate wpf c#



WPF-Databind a un StackPanel usando DataTemplates (3)

Modifiqué mi pregunta porque ha cambiado de enfoque al probar cosas. Reduje el problema al siguiente ...

Intento vincular el elemento seleccionado de un TreeView a un StackPanel (u otro contenedor que pueda contener los controles de usuario). Este contenedor mostrará un UserControl, dependiendo del tipo del elemento seleccionado.

Aquí está el xaml de StackPanel (tanto treeview como stackpanel están en la misma ventana ==> columna de cuadrícula diferente)

<StackPanel Grid.Column="2" MinWidth="500" DataContext="{Binding ElementName=myTree, Path=SelectedItem, Mode=OneWay}"> <StackPanel.Resources> <DataTemplate DataType="{x:Type mvTypes:MyTypeA}"> <controls:UserControlA DataContext="{Binding}" /> </DataTemplate> <DataTemplate DataType="{x:Type mvTypes:MyTypeB}"> <controls:UserControlB DataContext="{Binding}" /> </DataTemplate> </StackPanel.Resources> </StackPanel>

Cuando coloco un control de usuario directamente debajo del stackpanel (no en los recursos), lo muestra con el objeto seleccionado como su contexto de datos. Idem si coloco un TextBox en él, se mostrará el tipo correcto del elemento seleccionado.

<TextBox Name="textBox1" Text="{Binding}" />

Por alguna razón, colocarlo dentro de un DataTemplate (incluso sin configurar el DataType) no genera nada para mostrar.

Cualquier sugerencia Estoy pensando que tal vez un StackPanel no es el control correcto para esto, aunque parece que no puedo encontrar otros controles que se vean adecuados como contenedores como este.

Gracias por adelantado.


Aunque haya establecido la vinculación en el segundo control personalizado, ¿está configurando el DataContext, ya que el enlace es la ruta a la información y DataContext es la información a la que aplica esta información de enlace?

Andrés


Reemplace StackPanel en su ejemplo con ContentPresenter y en lugar de DataContext establezca la propiedad Content. Eso debería funcionar.


Puede crear un UserControl para mostrar TreeView y la información de selección a la derecha, todo en uno. Le evita crear cualquier control personalizado. Un control personalizado es básicamente innecesario ya que no crea nada que no existía antes.

<UserControl x:Class="NameSpace.SelectionView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="namespace.Controls" Height="300" Width="300"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TreeView Name="customTree"> <!--Items go here--> </TreeView> <StackPanel Grid.Column="1" MinWidth="50" DataContext="{Binding ElementName=customTree, Path=SelectedItem, Mode=OneWay}"> <StackPanel.Resources> <DataTemplate DataType="{x:Type StylingTest:CustomViewModelA}"> <controls:CustomADetailsControl /> </DataTemplate> <DataTemplate DataType="{x:Type StylingTest:CustomViewModelB}"> <controls:CustomBDetailsControl /> </DataTemplate> </StackPanel.Resources> <TextBlock Text="{Binding}"/> </StackPanel> </Grid> </UserControl>

Cualquier otro comportamiento personalizado, estoy seguro de que puede crear o establecer en estilos / plantillas aquí.

Además, puede encontrar que una de mis otras respuestas es útil.

Buena suerte con wpf, vítores.