style - wpf templates
WPF: use un ListBox en una plantilla que serĂ¡ la plantilla de otro ListBox (3)
Con Card como el siguiente:
public class Card
{
private string _name;
public Card(string name)
{
_name = name;
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
y Libro como el siguiente:
public class Book
{
private readonly ObservableCollection<Card> _cards;
public Book(ObservableCollection<Card> cards)
{
_cards = cards;
}
public ObservableCollection<Card> Cards
{
get { return _cards; }
}
}
Luego crea tu ListBox en la ventana:
<ListBox
ItemsSource="{Binding ElementName=Window, Path=Books}"
ItemTemplate="{StaticResource MainListTemplate}" />
y en los recursos para la ventanilla:
<Window.Resources>
<ResourceDictionary>
<DataTemplate
x:Key="InsideListTemplate">
<TextBlock
Text="{Binding Name}" />
</DataTemplate>
<DataTemplate
x:Key="MainListTemplate">
<ListBox
ItemsSource="{Binding Cards}"
ItemTemplate="{StaticResource InsideListTemplate}" />
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
Su ListBox usa MainListTemplate, que contiene un ListBox. El ItemsSource para ese ListBox es su lista de Tarjetas, y el ItemTemplate es el InsideListTemplate. Lo tengo como un simple TextBlock pero puedes hacer lo que necesites.
Tengo un ListBox cuyo ItemSource es un ObjectDataProvider que es una instancia de un ObservableCollection. The ObservableCollection es una colección de ObservableCollections. ItemTemplate del ListBox es un DataTemplate que crea un ListBox para cada elemento del listbox. Para ilustrar esto mejor, estoy tratando de recrear un juego de cartas en WPF. Básicamente, de una mano de cartas puedes crear libros. Después de tener un libro válido, puede elegir convertirlo en un libro que se incluirá en el ObservableCollection of Books. El problema que estoy teniendo es que cada elemento del ListBox es un ListBox que tiene un ItemSource que es un Libro, que es un ObservableCollection of Cards. No creo que tenga un problema con la fuente o la plantilla del ListBox externo, pero me está costando entender cómo voy a establecer el origen de los elementos ListBox en la colección de tarjetas para cada libro. Esencialmente, mi pregunta puede ser confusa y un concepto difícil de entender, pero esencialmente estoy tratando de descubrir cómo usar un ListBox en una plantilla que será la plantilla de otro ListBox. Si alguien tiene alguna idea de cómo abordar esto, agradecería mucho escucharlo.
Gracias por las respuestas. Si bien estoy de acuerdo con ambas respuestas, y siempre aprecio que me notifiquen sobre las malas prácticas de codificación, la primera respuesta dio resultado. Estaba teniendo un problema con ItemsSource de ListBox dentro de mi DataTemplate. En algún lugar a lo largo de las líneas de aprendizaje de WPF, me enganché en utilizar ObjectDataProvider (s) como mis ItemsSource. Como ObjectDataProvider era solo una instancia de la colección, y cuando la actualizaba, la fuente de las tarjetas para todos mis "Libros" sería la misma. Cambiar mis elementos Fuente de enlace de fuente directamente a la colección observable "Tarjetas" hizo el truco.
Aunque puede ser confuso con respecto a la IU, no estoy seguro de que vaya a permitir que los elementos en cualquiera de las listas sean seleccionables. Mis intenciones eran meramente para una representación visual de los libros de los jugadores. Es posible que deba permitir que los elementos de la lista externa sean seleccionables para poder mover las tarjetas de un libro y volver a la mano principal, pero aún no estoy seguro.
Gracias de nuevo por la ayuda.
Gracias, Brandon
No coloque un ListBox dentro de un ListBox, se creará una interfaz de usuario muy confusa porque tendrá varios "niveles" de elementos seleccionados.
Puede poner un ItemsControl dentro de un ListBox si necesita un ListBox único con una colección dentro de cada elemento o un ListBox dentro de un ItemsControl si necesita múltiples cuadros de lista.