2009-09-22 32 views
40

Ok, miré otras preguntas y no parecía obtener mi respuesta, así que espero que alguien aquí pueda.WPF Combobox DisplayMemberPath

Pregunta muy simple ¿por qué la propiedad DisplayMemberPath no se vincula al elemento?

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" DisplayMemberPath="{Binding Name}" SelectedItem="{Binding Prompt}"/> 

El resultado de seguimiento muestra que se está tratando de obligar a la clase de la celebración de la no IEnumerable el artículo real en el IEnumerable. Estoy confundido en cuanto a una forma simple de llenar un cuadro combinado sin agregar un grupo de líneas en xaml.

Simplemente llama a ToString() para el objeto en itemssource. Tengo un trabajo que es este:

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" SelectedItem="{Binding Prompt}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Pero en mi opinión es demasiado para una tarea tan simple. ¿Puedo usar un enlace de sourcesource?

Respuesta

115

DisplayMemberPath especifica la ruta a la propiedad de cadena de visualización para cada elemento. En su caso, lo configuraría en "Name", no en "{Binding Name}".

+0

eres absolutamente increíble, no puedo creer que haya olvidado lo obvio. – Jose

+0

contento de ayudar! (con algo de relleno para satisfacer SO) –

+0

Mismo problema aquí. Gracias, ¡TAN al rescate otra vez! –

7

No está vinculando los datos de la clase, le está diciendo que obtenga sus datos del miembro de la clase que recibe el nombre "miembro" del miembro, por lo que si su instancia tiene item.Name == "steve" está tratando de obtener los datos desde item.steve.

Para que esto funcione, debe eliminar el enlace de MemberPath. Cámbielo a MemberPath = "Name", esto le dice que obtenga los datos del miembro "Nombre". De esa forma llamará al item.Name, no al item.steve.

5

Debe cambiar MemberPath="{Binding Name}" por MemberPath="Name". Entonces funcionará.

5

Puede quitar DisplayMemberPath y luego establecer la ruta en el TextBlock.
DisplayMemberPath es realmente para cuando no tiene ItemTemplate.
O puede eliminar su ItemTemplate y usar DisplayMemberPath, en cuyo caso básicamente crea un TextBlock para usted. No recomendado que haga ambas cosas.

<TextBlock text="{Binding Path=Name, Mode=OneWay}" 
2

Como alternativa, no es necesario configurar DisplayMemberPath. solo puede incluir una anulación de ToString() en su objeto que está en su Lista de Prompt. de esta manera:

class Prompt { 
    public string Name = ""; 
    public string Value = ""; 

    public override string ToString() { 
     return Name; 
    } 
} 

El ToString() será llamado automáticamente y mostrar el parámetro Nombre de su clase. esto funciona para ComboBoxes, ListBoxes, etc.

+5

Esta no es una buena solución. ToString() es solo la estrategia predeterminada y alternativa y no el estándar para llevar información a la GUI. –

Cuestiones relacionadas