c# - wpf listview grouping
Mostrar mĂșltiples tipos de una sola lista en un WPF ListBox? (2)
Tienes que usar un DataTemplateSelector . Vea aquí para un ejemplo.
Información complementaria en MSDN
Soy relativamente nuevo en WPF, y parece que hay muchas formas de hacerlo, pero no puedo obtener ninguno de los que he intentado.
Tengo una ObservableCollection que contiene dos tipos diferentes.
Quiero vincular esta lista a un ListBox y mostrar diferentes DataTemplates para cada tipo encontrado. No puedo entender cómo cambiar automáticamente las plantillas de datos según el tipo.
Intenté utilizar la propiedad DataType de DataTemplate e intenté usar ControlTemplates y DataTrigger, pero fue en vano, o bien no apareció nada, o bien dice que no puede encontrar mis tipos ...
Ejemplo de intento a continuación:
Solo tengo una plantilla de datos conectada al ListBox en este momento, pero incluso eso no funciona.
XAML:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="PersonTemplate">
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
<DataTemplate x:Key="QuantityTemplate">
<TextBlock Text="{Binding Path=Amount}"></TextBlock>
</DataTemplate>
</Window.Resources>
<Grid>
<DockPanel>
<ListBox x:Name="MyListBox" Width="250" Height="250"
ItemsSource="{Binding Path=ListToBind}"
ItemTemplate="{StaticResource PersonTemplate}"></ListBox>
</DockPanel>
</Grid>
</Window>
Código detrás:
public class Person
{
public string Name { get; set; }
public Person(string name)
{
Name = name;
}
}
public class Quantity
{
public int Amount { get; set; }
public Quantity(int amount)
{
Amount = amount;
}
}
public partial class Window1 : Window
{
ObservableCollection<object> ListToBind = new ObservableCollection<object>();
public Window1()
{
InitializeComponent();
ListToBind.Add(new Person("Name1"));
ListToBind.Add(new Person("Name2"));
ListToBind.Add(new Quantity(123));
ListToBind.Add(new Person("Name3"));
ListToBind.Add(new Person("Name4"));
ListToBind.Add(new Quantity(456));
ListToBind.Add(new Person("Name5"));
ListToBind.Add(new Quantity(789));
}
}
Usted dice que "afirma que no puede encontrar mis tipos". Ese es un problema que debes solucionar.
El problema, probablemente, es que no está creando una declaración de espacio de nombres en el XAML que hace referencia a su espacio de nombre y ensamblado de CLR. Debes poner algo como esto en el elemento de nivel superior del XAML:
xmlns:foo="clr-namespace:MyNamespaceName;assembly=MyAssemblyName"
Una vez hecho esto, XAML sabrá que cualquier cosa con el prefijo de espacio de nombres XML foo
es en realidad una clase en MyAssemblyName
en el espacio de nombres MyNamespaceName
.
Luego puede hacer referencia a ese espacio de nombres XML en el marcado que creó el DataTemplate
:
<DataTemplate DataType="{foo:Person}">
Ciertamente puedes construir un selector de plantillas, pero eso es agregar una pieza de crumble a tu software que no necesita estar allí. Hay un lugar para los selectores de plantillas en las aplicaciones de WPF, pero esto no es todo.