c# - significa - Enlace a la propiedad anidada mostrando solo el primer elemento en la lista
que significa alt en una imagen (1)
Parece que al configurar DisplayMember
en "NestedItem.Name" solo se muestra la propiedad NestedItem.Name
de SelectedItem
; lo probé; si SelectedItem cambió, el Nombre que se muestra también cambió en consecuencia -. El trabajo más fácil es agregar otra propiedad para DisplayMember :
public class MyItem
{
public NestedItem NestedItem { get; set; }
public int Number { get; set; }
public String NestedItemName { get { return NestedItem.Name; } }
}
Luego configure DisplayMember
:
listBox1.DisplayMember = "NestedItemName";
No es elegante, pero es más fácil que usar el descriptor de propiedades como se sugiere aquí o aquí .
ACTUALIZAR:
Lo que sigue es una prueba rápida que hice. Agregue un botón para alternar listBox1''s DisplayMember
. Onclick
eventos Onclick
:
listBox1.DisplayMember = (listBox1.DisplayMember == "Number") ? "NestedItem.Name" : "Number";
Cuando DisplayMember
establece en "Número", puede elegir cualquier elemento de la lista, no necesariamente el primer elemento , y luego hacer clic en el botón nuevamente. Verá que SelectedItem''s NestedItem.Name
muestra SelectedItem''s NestedItem.Name
.
Estoy intentando vincular un Control ListBox en C # Winforms en .NET 4.5 a una lista de objetos que tienen una propiedad anidada que deseo usar para un DisplayMember. Funciona de alguna manera, excepto que cuando configuro DisplayMember en la propiedad anidada, el cuadro de lista solo muestra un elemento, aunque hay dos elementos en la lista a los que está vinculado. Si hago un comentario sobre el código para configurar DisplayMember, listBox muestra dos elementos. ¿Es esto un error en el marco? Me gustaría evitar agregar otra propiedad o reemplazar ToString () si puedo ya que estoy implementando MVP y me gustaría mantener mi lógica de vista aislada para mi vista. Aquí hay un código de ejemplo a continuación.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var bindingSource = new BindingSource();
var listOfMyItems = new BindingList<MyItem>
{
new MyItem { Number = 1, NestedItem = new NestedItem { Name = "name1", Note = "note1" } },
new MyItem { Number = 2, NestedItem = new NestedItem { Name = "name2", Note = "note2" } },
};
bindingSource.DataSource = listOfMyItems;
listBox1.DataSource = bindingSource;
//comment out the line below and the listBox1 will show 2 items
listBox1.DisplayMember = "NestedItem.Name";
}
}
public class NestedItem
{
public string Name { get; set; }
public string Note { get; set; }
}
public class MyItem
{
public NestedItem NestedItem { get; set; }
public int Number { get; set; }
}