2011-03-21 14 views
5

Ok, no soy novato en programación o C# como tal, parece que no puedo conectarme directamente a la información de WPF. Mis colegas están delirando al respecto (y sí, también les preguntaré) pero ahora estoy perplejo.Parece que no puede obtener WPF DataBinding en mi cabeza

Esto es lo que me gustaría hacer para empezar:

Como ejemplo tengo una lista de cosas como esto:

List<Thing> thingList = Source.getList(); 

Ahora, normalmente me gustaría ir

foreach(Thing t in thingList) 
{ 
    //add thing to combobox 
} 

Pero por lo que puedo deducir es que puedo de alguna manera no hacer esto, sino usar un enlace de datos para poblar la c ombobox para mí.

Lo que parece que no puedo obtener es donde pongo el 'thingList'? ¿Lo hago una propiedad separada en alguna parte? ¿Dónde pongo esa propiedad?

Me siento muy estúpido en este momento, ya que he estado luchando con esto desde hace un tiempo y no puedo encontrar ningún ejemplo que me haga entender este concepto, probablemente muy simple.

¿Alguien que esté dispuesto a ayudarme o que me señale una guía paso a paso que podría haberme perdido?

+0

Si es algo como el enlace de datos de Windows Forms, su cuadro combinado debe tener una propiedad 'DataSource' (o algo similar), y debe ser capaz de establecer' comboBox.DataSource = Source.getList(); 'Como siempre que haya configurado 'DisplayMember' y' ValueMembers' se mostrará el elemento correcto, y SelectedValue recuperará el objeto en sí. – Crisfole

+0

Aquí hay un par de preguntas que le ayudarán a comenzar en la dirección correcta: [Enlazando WPF ComboBox a una lista personalizada] (http://stackoverflow.com/questions/561166/binding-wpf-combobox-to-a- lista personalizada) y [MVVM: Tutorial de principio a fin] (http://stackoverflow.com/questions/1405739/mvvm-tutorial-from-start-to-finish) –

+0

En WPF, se usan cosas como ComboBoxes y ListViews como contenedores visuales para los datos. Cree y edite sus listas en código subyacente, o desde un archivo, etc. y conéctelo al control en el formulario. – coldandtired

Respuesta

2

Utilice ObservableCollection<T> para enlace de datos en WPF. Donde T es tu clase Vea el ejemplo a continuación

public class NameList : ObservableCollection<PersonName> 
{ 
    public NameList() : base() 
    { 
     Add(new PersonName("A", "E")); 
     Add(new PersonName("B", "F")); 
     Add(new PersonName("C", "G")); 
     Add(new PersonName("D", "H")); 
    } 
    } 

    public class PersonName 
    { 
     private string firstName; 
     private string lastName; 

     public PersonName(string first, string last) 
     { 
      this.firstName = first; 
      this.lastName = last; 
     } 

     public string FirstName 
     { 
      get { return firstName; } 
      set { firstName = value; } 
     } 

     public string LastName 
     { 
      get { return lastName; } 
      set { lastName = value; } 
     } 
    } 

Ahora en XAML. Ir al recurso etiqueta

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

    xmlns:c="clr-namespace:SDKSample" 

    x:Class="Sample.Window1" 
    Width="400" 
    Height="280" 
    Title="MultiBinding Sample"> 

    <Window.Resources> 
    <c:NameList x:Key="NameListData"/> 
    </Window.Resources> 


<ListBox Width="200" 
     ItemsSource="{Binding Source={StaticResource NameListData}}" // Name list data is declared in resource 
     ItemTemplate="{StaticResource NameItemTemplate}" 
     IsSynchronizedWithCurrentItem="True"/> 

xmnls:c te dará la opción de elegir la clase. Aquí puedes elegir c, d, e x lo que sea, pero asegúrate de que debe usarse antes

+1

Solo necesita utilizar 'ObservableCollection' cuando se espera que la colección cambie. Si la colección es estática, todo lo que implemente 'IEnumerable' estará bien. –

+0

Sí, lo sé, se usará cuando necesite un enlace bidireccional; de lo contrario, simplemente fuente de datos y miembro del valor de datos etc. funciona –

+0

Esto es principalmente lo que estaba buscando, sí. Sé que es un tema muy amplio, pero lo que describes es casi como el proceso "automático" en el que estaba pensando. Gracias. –

2

Cuando se trata de vincular datos, he encontrado que this page si se lee responde la mayoría de las preguntas que los principiantes tienen al respecto.

Para responder a la pregunta: El alernative a agregar todos los artículos es decirle al ComboBox de dónde obtener sus artículos, esto se hace con la propiedad ItemsSource.

Puede configurar esto en XAML o en el código, mientras que se necesitaría una expresión de enlace en XAML una asignación normal debe hacer en código:

comboBox.ItemsSource = thingList; 

Si no se especifica con más detalle cómo esos objetos en el la lista debe mostrarse. Se llamará al método ToString, a menos que se anule, generalmente terminará con la ruta de clase de su objeto. Hay dos formas principales de decirle a la aplicación cómo mostrar el objeto:

La primera opción y más pesada es Data Templates que se utiliza para visualizar datos complejos usando controles (que a su vez pueden tener elementos y plantillas, etc.), el segundo manera está utilizando propiedades livianas como DisplayMemberPath, que se debe establecer con el nombre de la propiedad que se debe mostrar (generalmente solo una cadena).

Si su lista cambia y el cuadro combinado debe actualizarse por sí mismo la fuente debe implementar INotifyCollectionChanged, en la mayoría de los casos utilizará la implementación estándar ObersableCollection<T>.

1

La mayoría de las personas usaría WPF Databinding para llenar el cuadro combinado pero no es necesario.

Puede agregar los elementos por código si lo desea.

Es fácil quedar atrapado en hacer todo lo que "debería" hacerse sin tener una buena razón para hacerlo de esa manera (por cierto, no te recomiendo que añadas manualmente los elementos, solo digo que puedes)

List<Thing> thingList = Source.getList(); 

foreach(Thing t in thingList) 
{ 
    combobox.Items.Add(t); 
} 
+0

Esta es probablemente la peor manera posible de lograr esto y hay muchas buenas razones para no hacerlo de esta manera. Como mínimo, debe actualizar su ejemplo para asignar la colección a ItemsSource en lugar de agregar cada elemento individualmente. –

+0

Creo que dejé en claro que no estaba recomendando esta forma de llenar la lista. Estaba respondiendo a la declaración "Pero por lo que puedo deducir es que de alguna manera no puedo hacer esto". – grantnz

Cuestiones relacionadas