/ / no se pueden agregar controles de botón dentro del cuadro de lista dinámicamente en la aplicación de Windows Phone - wpf, silverlight, windows-phone-7.1

no se pueden agregar controles de botón dentro del cuadro de lista dinámicamente en la aplicación de Windows Phone: wpf, silverlight, windows-phone-7.1

Estoy tratando de agregar diferentes botones de control.dentro del cuadro de lista dinámicamente para cada elemento del cuadro de lista junto con los datos mientras lo llena. Para lograr esto, bajo la etiqueta de la placa de datos, he agregado un nuevo panel de pila en el que coloqué los botones de control. Ahora, estoy tratando de encontrar el panel de la pila particular en el que se colocan los botones y luego hacerlos visibles verdaderos o falsos dependiendo de mi condición. Por lo tanto, he tratado de encontrar el panel de pila deseado para obtener el control sobre él mediante el bucle de los elementos del cuadro de lista. Sin embargo, estoy obteniendo "Excepción de referencia nula" al iterar los elementos del cuadro de lista. El siguiente es mi código xaml y el siguiente es mi código xaml.cs:

               <ListBox x:Name="TripList" Height="465" HorizontalAlignment="Left" VerticalAlignment="Top" Width="456" Background="White" Foreground="Blue">
<ListBox.ItemTemplate>
<DataTemplate>

<Border BorderBrush="Black" BorderThickness="0,0,0,4">
<StackPanel Orientation="Vertical" Width="456">
<StackPanel Orientation="Vertical">
<StackPanel VerticalAlignment="Top" Orientation="Horizontal">
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" Width="370" FontSize="24" Text="{Binding PUDetails}"/>
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="24" Text="{Binding TripStatus}"/>
</StackPanel>
<StackPanel VerticalAlignment="Top" Orientation="Horizontal">
<StackPanel VerticalAlignment="Top" Orientation="Horizontal" Width="300">
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Conf: "/>
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding ConfNumber}"/>
</StackPanel>
<StackPanel VerticalAlignment="Top" Orientation="Horizontal">
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Est Do Tm: "/>
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding DOTime}"/>
</StackPanel>
</StackPanel>
<StackPanel VerticalAlignment="Top" Orientation="Vertical">
<StackPanel x:Name="stacktest" Background="Azure" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top">
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Svc: "/>
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding TripService}"/>
</StackPanel>
<StackPanel VerticalAlignment="Top" Orientation="Horizontal">
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="PU: "/>
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding PURoute}"/>
</StackPanel>
<StackPanel VerticalAlignment="Top" Orientation="Horizontal">
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="DO: "/>
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding DORoute}"/>
</StackPanel>
<StackPanel VerticalAlignment="Top" Orientation="Horizontal">
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Pax: "/>
<TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding PaxDetails}"/>
</StackPanel>
</StackPanel>
</StackPanel>
<StackPanel x:Name="stknotchecked" VerticalAlignment="Top" Orientation="Vertical">

<StackPanel Orientation="Horizontal">
<Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="300" x:Name="btnaccepttrip" Content="accept trip"></Button>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btnrejecttrip" Content="reject"></Button>
<Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btnshowmap" Content="show map"></Button>
</StackPanel>
</StackPanel>
<StackPanel x:Name="stkaccepted">
<StackPanel Orientation="Horizontal">
<Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btndirections" Content="directions"></Button>
<Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btnflightinfo" Content="flight info"></Button>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btndetails" Content="details"></Button>
<Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btnlogtimes" Content="log times"></Button>
</StackPanel>
<StackPanel>
<Button x:Name="btnstatus" Content="set status"></Button>
</StackPanel>
</StackPanel>
</StackPanel>
</Border>

</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>



private void addbtncontrols()
{

foreach (TripsList lst in TripList.Items)
{
ListBoxItem item = TripList.ItemContainerGenerator.ContainerFromItem(lst) as ListBoxItem;
Button stk = FindFirstElementInVisualTree<Button>(item);
var stkitem =(Button)stk.FindName("btndirections");
stkitem.Visibility = Visibility.Collapsed;
}
}

private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
{
var count = VisualTreeHelper.GetChildrenCount(parentElement);
if (count == 0)
return null;

for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(parentElement, i);

if (child != null && child is T)
{
return (T)child;
}
else
{
var result = FindFirstElementInVisualTree<T>(child);
if (result != null)
return result;

}
}
return null;
}

¿Podría alguien, por favor, dejarme saber la manera de resolver mi problema. Gracias por adelantado..

Respuestas

0 para la respuesta № 1

Navegando por el árbol visual para ubicarlos.¡Los elementos y configurar su visibilidad manualmente es la manera incorrecta de solucionar este problema! Veo que estás usando el enlace de datos. ¿Por qué no exponer varias propiedades de tipo Visibilidad en el modelo o modelo de vista que está enlazando a la interfaz de usuario? Entonces, puede vincularlas a la propiedad Visibilidad de los diversos elementos de la interfaz de usuario para mostrarlas / ocultarlas.

Como un aparte, aprende acerca de los estilos, tu XAML tieneNumerosas propiedades de estilo repetido que lo hacen largo y difícil de seguir. Debería poder definir un estilo de TextBlock que se aplique a todos sus TextBlocks para eliminar gran parte del código repetido en su pregunta.


0 para la respuesta № 2

De la descripción anterior, puede proporcionar más información sobre esto:

  1. ¿Dónde invocaste el método addbtncontrol? Si está respondiendo a un evento, digamos: agregue un elemento más, entonces debe hacerlo dentro de ViewModel.
  2. "Tu condición": ¿Qué tipo de condición? ¿Podemos modelarlo en el elemento de Listbox ViewModel?

He implementado algo igual: Cuadro de lista con elementos dinámicos y plantilla personalizada. También proporciona la posibilidad de agregar nuevo elemento. Entonces, si me da más información sobre lo que quiere lograr o mejora su modelo de vista, puedo ayudarlo.