2010-07-15 13 views
9

Pregunta: La mayoría de los ejemplos de código en el DataGridComboBox parecen utilizar un recurso estático como ItemsSource. En mi caso de uso, me gustaría proporcionar diferentes ItemsSources con cada objeto encuadernado. se puede hacer esto?Enlace de ItemsSource para una columna WPF DataGridComboBox

Antecedentes: Estoy tratando de obligar a una colección de objetos de la clase de preguntas a un DataGrid WPF, usando un control DataGridComboBoxColumn. La cadena de respuesta proporciona SelectedValue. Me gustaría que la lista AnswerDomain proporcione el ItemsSource para cada ComboBox. AnswerDomain difiere de Question to Question.

Clase

public class Question 
    { 
    string Answer {get; set;} 
    List<string> AnswerDomain {get; set;} 
    //...other stuff 
    } 

XAML

<DataGrid ItemsSource="{Binding Path=InspectionItems}" AutoGenerateColumns="False" Name="dataGrid1" > 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn Header="Answer Domain" 
           DisplayMemberPath="Answer" 
           SelectedValuePath="Answer" 
           ItemsSource="{Binding Path=AnswerDomain}" 
            > 
     </DataGridComboBoxColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Problema: Hay un par de problemas. El problema clave en este momento es que los ComboBoxes en cada fila DataGrid no muestran las cadenas AnswerDomain. Probé una serie de combinaciones XAML sin éxito. Ayudame Stack Overflow.

ACTUALIZACIÓN: La solución seleccionada a continuación funcionó. Después de algunas torpezas adicionales y al agregar UpdateSourceTrigger=PropertyChanged al elemento seleccionado, los cambios del usuario en el cuadro combinado se reflejaron nuevamente en el objeto personalizado subyacente.

<DataGridTemplateColumn Header="Answer"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox 
       ItemsSource="{Binding AnswerDomain}" 
       SelectedItem="{Binding Answer, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

Esta respuesta explica por qué no se puede obligar a una consolidación DataGridComboBoxColumn dinámico - http://stackoverflow.com/a/5411157/158675 – Edward

Respuesta

10

Su problema es que la ruta del miembro de la pantalla no es Respuesta porque no hay una propiedad "Respuesta" fuera de una cadena. Nunca uso el DataGridComboBoxColumn, no me parece natural, demasiado parecido al antiguo método win. Pruebe el siguiente en su lugar. PERO ASEGÚRESE DE IMPLEMENTAR INotifyPropertyChanged en su clase de preguntas, y active los eventos apropiados.

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding AnswerDomain}" SelectedItem="{Binding Answer}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Así es como la clase de pregunta debería ser:

public class Question : INotifyPropertyChanged 
{ 
    private string m_Answer; 
    public string Answer 
    { 
     get { return m_Answer; } 
     set 
     { 
      if (m_Answer != value) 
      { 
       m_Answer = value; 
       FirePropertyChanged("Answer"); 
      } 
     } 
    } 

    private List<string> m_AnswerDomain; 
    public List<string> AnswerDomain 
    { 
     get { return m_AnswerDomain; } 
     set 
     { 
      if (m_AnswerDomain != value) 
      { 
       m_AnswerDomain = value; 
       FirePropertyChanged("AnswerDomain"); 
      } 
     } 
    } 


    [field: NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void FirePropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 


} 
+0

Gracias , @viggity Eso hace el truco. Por extraño que parezca, incluso con el INPC implementado, tengo algunos problemas para lograr que los cambios en la UI reflejen de nuevo en la colección de objetos enlazados, pero supongo que ese es un problema diferente. Gracias de nuevo. -Wen –

Cuestiones relacionadas