2011-01-28 12 views
8

necesito para establecer la vista listview a un gridview que tenga una cabecera compleja como esta (en base a una lista de objetos en 3 dimensiones que he creado):cabecera de niveles múltiples GridView WPF

| ---------- LEVEL 0 ------------ | 
| -- Level 1a -- | -- Level 1b -- | 
| Lvl A | Lvl B | Lvl A | Lvl B | 

EDIT: Esto es más mineral de menos mi modelo de objetos

public class Measures 
{ 
    public string Caption { get; set; } 
    public List<Threshold> ThresholdList { get; set; } 
} 

public class Threshold 
{ 
    public string Caption { get; set; } 

    public double Value1 { get; set; } 
    public double Value2 { get; set; } 
    public double Value3 { get; set; } 
    public double Value4 { get; set; } 
} 

tengo que obligar a una lista dinámica de Measures (esto es mi nivel 0), a continuación, una lista dinámica de Threshold (nivel 1a ...) y para cada valores1 pantalla umbral 4 si lo son! = 0

+0

¿Qué tal apilar múltiples gridviewrowheaderpresenter? Podría ser una buena manera? Estoy atrapado en este problema ... – michele

+0

¿Podemos tener una mejor idea de cómo se ve su modelo/datos de objeto? – RQDQ

+0

@RQDQ He agregado el modelo de objeto Necesito mostrar – michele

Respuesta

1

¿Qué tal algo como esto:

<ListBox x:Name="MainListBox"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="Auto" /> 
         </Grid.RowDefinitions> 

         <Label Content="{Binding Path=Caption}" HorizontalAlignment="Center" /> 

         <ListBox Grid.Row="1" ItemsSource="{Binding Path=ThresholdList}" > 
          <ListBox.ItemsPanel> 
           <ItemsPanelTemplate> 
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch"> 
            </StackPanel> 
           </ItemsPanelTemplate> 
          </ListBox.ItemsPanel> 

          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <Grid> 
             <Grid.RowDefinitions> 
              <RowDefinition Height="Auto" /> 
              <RowDefinition Height="Auto" /> 
             </Grid.RowDefinitions> 

             <Label Content="{Binding Path=Caption}" HorizontalAlignment="Center" /> 

             <StackPanel Grid.Row="1" Orientation="Horizontal"> 
              <Label Content="{Binding Path=Value1}" /> 
              <Label Content="{Binding Path=Value2}" /> 
              <Label Content="{Binding Path=Value3}" /> 
              <Label Content="{Binding Path=Value4}" /> 
             </StackPanel> 
            </Grid> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 


         </ListBox> 

        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

que pueda necesitar para convertir el Valor1, propiedades en Value2 una colección para visualizar dinámicamente las que no son cero y usar el mismo enfoque de ListBox/StackPanel que utilicé para mostrar los umbrales.

Esto le da a la salida:

Screenshot

Y para completar el post, aquí está el código que utilicé:

List<Measures> measuresList = new List<Measures>(); 

Measures measures = new Measures() 
{ 
    Caption = "LEVEL 0", 
    ThresholdList = new List<Threshold>() 
}; 

measures.ThresholdList.Add(new Threshold() 
{ 
    Caption = "Level 1a", 
    Value1 = 1, 
    Value2 = 2, 
    Value3 = 3, 
    Value4 = 4 
}); 

measures.ThresholdList.Add(new Threshold() 
{ 
    Caption = "Level 1b", 
    Value1 = 5, 
    Value2 = 6, 
    Value3 = 7, 
    Value4 = 8 
}); 

measuresList.Add(measures); 

this.MainListBox.ItemsSource = measuresList; 
+0

¡Gracias, parece ser una buena pista, lo intentaré lo antes posible! Mi única duda es que necesito usar una vista de lista porque el modelo de objeto que escribí hasta ahora se repite para una fila n (que representa n miembro). Ahora estoy usando una solución más simple (porque los plazos del proyecto no esperan), ¡pero sigo buscando una solución más elegante! – michele

+0

@michele: este enfoque aún funciona para múltiples objetos de medida y múltiples objetos de umbral. ¿Es eso lo que intentas resolver? – RQDQ

+0

Probé tu código ejemplo. Funciona, pero necesito establecer esa estructura de árbol en el encabezado de una vista de lista, las filas en lista deben mostrar solo los valores de nivel inferior. Tu ejemplo establece el árbol dentro de cada fila y estoy tratando de evitarlo. Estoy pensando que la única solución es escribir un control personalizado completo. Gracias de nuevo – michele

0

Nivel 0 ¿Es ListView? El nivel 1A y el nivel 1b son vistas de cuadrícula que quieres dentro de dos columnas con diferentes plantillas dentro de la vista de lista de nivel 0. Entonces, el nivel A y el nivel b son dos vistas de cuadrícula más dentro de 2 columnas más en el nivel 1a y el nivel 1b?

Usted puede ser capaz de convertir el mismo concepto utiliza esta anidada GridView en WPF

http://forums.asp.net/t/1071521.aspx

no he probado a mí mismo en WPF, pero gridviews parecía estar construido de manera similar. Simplemente use paneles en lugar de Divs, y menos dolores de cabeza con tener que preocuparse por las llamadas de cliente/servidor.

También los conjuntos de datos funcionan mejor que las listas.

Aquí hay un código pseudo sobre cómo he creado conjuntos de datos anidadas antes

DataSet ds1 = new DataSet(); 
     ds1.Tables.Add(m_DataLayer.GetRealA_Data(X, Y).Copy()); Returns Table ["A"] 
     ds1.Tables.Add(m_DataLayer.GetB_Empty().Copy());// Returns Table ["B"] 
     ds1.Tables.Add(m_DataLayer.GetC_Empty().Copy());// Returns Table ["C"] 
     ds1.Tables.Add(m_DataLayer.GetD_Empty().Copy());// Returns Table ["D"] 

     ds1.Relations.Add("b", ds1.Tables["A"].Columns["A_id"], ds1.Tables["B"].Columns["A_id"]); 
     ds1.Relations.Add("c", ds1.Tables["B"].Columns["B_id"] 
      , ds1.Tables["C"].Columns["B_id"]); 
     ds1.Relations.Add("d", ds1.Tables["C"].Columns["C_id"] 
      , ds1.Tables["D"].Columns["D_id"]); 

     dt_TheGridViewDataSet = ds1; 
     TheGridView.DataSource = ds1; 
+0

Muchas gracias por la pista. Lamentablemente, trabajar con gridviews anidados no parece ser la solución para mi problema. Necesito tener una sola vista de lista, que muestre el nivel más bajo (lvl A, lvlB): los niveles superiores son solo descriptivos, necesito que sepan a qué objeto se refiere lvlA ect. – michele

0

¿Ha pensado cómo debe comportarse - su cabecera ¿es decir?

Es bastante fácil hacer un encabezado que se parece al que sugiere, podría compilarlo con algunas grillas programáticamente, pero ese es solo el encabezado. ¿Deberías poder cambiar el tamaño como lo haces normalmente con un encabezado listview?

¿Quizás estás buscando algo así como un TreeListView?

http://www.codeproject.com/KB/WPF/TreeListView.aspx

creo que eso es lo que me gustaría ir después de que muestra datos multidimensional - es fácil de entender y utilizar, donde una vista de lista personalizada puede ser difícil de implementar a comportarse bien.

+0

gracias por la pista. Cuando tenga algo de tiempo libre, ¡quiero probar ese control! – michele

Cuestiones relacionadas