Tengo una colección personalizada que paso a un cliente WPF, que vincula la colección a datagrid
usando AutoGenerateColumns="True"
. Sin embargo, la cuadrícula de datos muestra filas vacías (aunque el número correcto de filas vacías). ¿Qué estoy haciendo mal? Lo siguiente es un código de muestra. Por ahora, he omitido todo lo relacionado con INotifyPropertyChanged
y INotifyCollectionChanged
porque, bueno, primero quiero que aparezcan algunos datos en la grilla.WPF: Implementación y enlace (datagrid) a una colección personalizada
También debo mencionar que he intentado implementar las dos interfaces anteriores, pero parecen no tener nada que ver con este problema.
(En realidad, no puede ser que desee ver en el código de ejemplo que no hay absolutamente nada interesante al respecto La implementación de la colección se acaba envolviendo una Lista de interior..)
Algunos aleatoria POCO:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
implementación simple colección:
public class MyCollection<T> : IList<T>
{
private List<T> list = new List<T>();
public MyCollection()
{
}
public MyCollection(IEnumerable<T> collection)
{
list.AddRange(collection);
}
#region ICollection<T> Members
public void Add(T item)
{
list.Add(item);
}
public void Clear()
{
list.Clear();
}
public bool Contains(T item)
{
return list.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
list.CopyTo(array, arrayIndex);
}
public int Count
{
get { return list.Count; }
}
public bool IsReadOnly
{
get { return false; }
}
public bool Remove(T item)
{
return list.Remove(item);
}
#endregion
#region IEnumerable<T> Members
public IEnumerator<T> GetEnumerator()
{
return list.GetEnumerator();
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
#region IList<T> Members
public int IndexOf(T item)
{
return list.IndexOf(item);
}
public void Insert(int index, T item)
{
list.Insert(index, item);
}
public void RemoveAt(int index)
{
list.RemoveAt(index);
}
public T this[int index]
{
get { return list[index]; }
set { list[index] = value; }
}
#endregion
}
El XAML:
<Window x:Class="TestWpfCustomCollection.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid AutoGenerateColumns="True"
HorizontalAlignment="Stretch"
Name="dataGrid1" VerticalAlignment="Stretch"
ItemsSource="{Binding}"
/>
</Grid>
</Window>
de la ventana de código subyacente:
public MainWindow()
{
InitializeComponent();
MyCollection<Person> persons = new MyCollection<Person>()
{
new Person(){FirstName="john", LastName="smith"},
new Person(){FirstName="foo", LastName="bar"}
};
dataGrid1.DataContext = persons;
}
Por cierto, si se cambia el código subyacente para utilizar una lista < persona> en lugar de la MiColeccion < persona>, todo funciona como se esperaba.
EDIT:
El código anterior no se ha tomado de la situación real. Solo lo publiqué para mostrar lo que estoy haciendo para probar mi problema y facilitar la replicación. El objeto de recopilación personalizado real es bastante complejo y no puedo publicarlo aquí. Una vez más, estoy tratando de entender el concepto básico detrás de lo que se necesita hacer para que una cuadrícula de datos se vincule correctamente a una colección personalizada y genere columnas automáticamente para los objetos subyacentes.
Lo siento, probablemente no estaba claro en mi pregunta. El objeto MyCollection solo pretendía describir el problema. La colección personalizada real que estoy usando es completamente diferente. Solo estoy tratando de entender cómo hacer que esto funcione. Actualizará la pregunta. – joniba
Respuesta recién actualizada – devdigital
Divertido, todos los caminos solo conducen a ese mismo artículo. De hecho, seguí las instrucciones del artículo al que me vinculaste. Y eso me llevó al fenómeno que mencioné en la pregunta. En cuanto a usar el modelo de vista como intermediario, eso es exactamente lo que quería evitar implementando mi propia colección. Esa es la implementación actual, pero quiero reducir la cantidad de código vinculante. Además, intencionalmente quería evitar el tema de INotify___ porque primero quiero ver que AutoGenerateColumns funciona en la cuadrícula de datos. – joniba