databinding - wpf combobox datacontext
WPF: ComboBox muestra "(namespace).(Classname)" en lugar de datos (4)
Lo que está haciendo el mecanismo de enlace es llamar a ToString () en el tipo que se está vinculando. Debido a que supongo que no está reemplazando a ToString (), solo lo hará el namespace.type en lugar de algo útil.
Como dice un rebelde, puede usar DisplayMember para indicar al enlace que use una propiedad de ese nombre para el valor de visualización o puede anular ToString () como se muestra a continuación para mostrar su propiedad personalizada.
public void Contact
{
public string FirstName { get; set; }
public override string ToString()
{
return FirstName;
}
}
Quiero que mi ComboBox
en XAML se vincule a mi colección de List
de objetos personalizados en el código subyacente.
Actualmente, el ComboBox
enumera para cada entrada dpwpf.Contact
que es mi {namespace}.{classname}
.
¿Qué debo poner en el XAML para decirle que haga una lista, por ejemplo, Apellido + Nombre?
Sé que es algo así como {Binding Path=... Value=...}
pero no puedo obtenerlo.
XAML:
<Window x:Class="dpwpf.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">
<StackPanel>
<StackPanel>
<TextBlock Text="Select the contact:"/>
<ComboBox Name="theContactList"/>
</StackPanel>
</StackPanel>
</Window>
Código detrás:
namespace dpwpf
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
StoreDB db = new StoreDB();
List<Contact> contacts = db.GetContacts()
theContactList.ItemsSource = contacts.ToList();
}
}
}
Responder:
<Window x:Class="dpwpf.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"
xmlns:local="clr-namespace:dpwpf">
<Window.Resources>
<DataTemplate DataType="{x:Type local:Contact}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding LastName}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<StackPanel>
<StackPanel Margin="10">
<TextBlock Text="Contact Name:" Foreground="#555"/>
<TextBox Name="theName"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Select the contact:"/>
<ComboBox Name="theContactList"/>
</StackPanel>
</StackPanel>
</Window>
Puede anular el método ToString
de Contact
, o puede definir un DataTemplate
en WPF.
xmlns:dpwpf="... namespace of dpwpf"
<Window.Resources>
<DataTemplate DataType="{x:Type dpwpf:Contact}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding LastName}">
<TextBlock Text=" ">
<TextBlock Text="{Binding FirstName}">
</StackPanel>
</DataTemplate>
</Window.Resources>
Esto le permite definir cómo aparecerá un objeto de Contact
en cualquier lugar de la ventana. Si desea limitar esto a ComboBox
, puede agregar DataTemplate
solo a los recursos de ComboBox
.
Ver también ¿Qué significa "{Binding}"? por Bea Stollnitz
necesita usar DisplayMember = "TheValue"
puede agregar esto en el XAML o en el CLR también tenga en cuenta su enlace en cose y no a través del XAML. Creo que esto se relaciona con una pregunta previa tuya. que implementa el enlace mediante ObjectDataProvider usa ese ejemplo y agrega DisplayMemeber = "memeber" en el XAML
HTH, Eric,
Solo agregue esto en su etiqueta ComboBox (código xaml)
TextSearch.TextPath ="Title"
ToString()
modificación de ToString()
afecta todos los casos futuros que lo necesite, no le recomiendo que haga eso.
Vea ese ejemplo: http://simplesample.site90.com/wpf_combobox.php