2009-09-30 14 views
12

me gustaría hacer lo siguiente:C#/WPF: Encuadernación Combobox ItemSource en Datagrid con el elemento exterior de la DataContext

public List<Users> PreLoadedUserList { get; set; } 
public List<RowEntries> SomeDataRowList { get; set; } 

public class Users 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 
public class SomeDataRowList 
{ 
    public int UserAge { get; set; 
} 

Ahora mi (WPF Toolkit) cuadrícula de datos es el siguiente:

<my:DataGrid AutoGenerateColumns="False" MinHeight="200" 
      ItemsSource="{Binding Path=SomeDataRowList}"> 
    <my:DataGridComboBoxColumn Header="Age" 
           ItemsSource="{Binding Path=PreLoadedUserList}" 
           DisplayMemberPath="Name" 
           SelectedValueBinding="{Binding Path=UserAge}"/> 

</my:DataGrid> 

Ahora mi problema es que PreLoadedUserList está fuera de ItemSource (SomeDataRowList) y no sé cómo enlazar algo fuera de él. Lo que realmente quiero: - Pantalla en el cuadro combinado PreLoadedUserList - Establecer el valor de (RowEntries) SelectedItem.UserAge al valor de la seleccionada ComboboxItem.Age

Avísame si mi explicación es demasiado extraño :-)

Gracias, Saludos

Respuesta

23

Aquí vamos :-)

<my:DataGridTemplateColumn Header="SomeHeader"> 
    <my:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox SelectedValuePath="UserAge" 
       SelectedValue="{Binding Age}" 
       DisplayMemberPath="Name" 
       ItemsSource="{Binding Path=DataContext.PreLoadedUserList, 
        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
       IsReadOnly="True" Background="White" /> 
     </DataTemplate> 
    </my:DataGridTemplateColumn.CellTemplate> 
</my:DataGridTemplateColumn> 

Esperamos que esto pueda ayudar a alguien más también.

Cheers

+0

Esto me ayudó mucho ... ¡Gracias! –

+0

Wow, estaba intentando y probando con 'DataGridComboBoxColumn' y nada .. ¡Pero entonces MAGIC! Tu hermoso ejemplo funciona (con cosas de Template) ¡Gracias! –

+0

Esto me ayudó a resolver mi pregunta, Joseph. Manejar estos combobox de encabezado fue mi siguiente tarea. Tu solución me ayudó mucho y me ahorró mucho tiempo. Muchas gracias. – Tvd

0

Si RowEntries es una clase personalizada, simplemente le dan una referencia a la PreLoadedUserList. Luego, cada instancia tiene un puntero y puede usarlo en su enlace.

Solo una sugerencia, los nombres de clase como Usuarios y RowEntries sugieren que son colecciones pero parece que su uso es el elemento, no la colección. Usaría nombres singulares para evitar confusiones. Me gustaría hacer algo como esto

public List<User> PreLoadedUserList { get; set; } 
public List<RowEntry> SomeDataRowList { get; set; } 

public class User 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 
public class RowEntry 
{ 
    public int UserAge { get; set; } 
    public List<User> PreLoadedUserList { get; set; } 
} 

// at the point where both PreLoadedUserList is instantiated 
// and SomeDataRowList is populated 
SomeDataRowList.ForEach(row => row.PreLoadedUserList = PreLoadedUserList); 
Cuestiones relacionadas