2011-01-28 15 views
8

muszę ustawić widok listview do GridView, które mają złożoną nagłówek takiego (na podstawie 3 wymiarowej liście obiektów stworzyłem):nagłówek Wielopoziomowa GridView WPF

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

EDIT: Jest więcej rudy mniej mój model obiektowy

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; } 
} 

mam powiązać dynamiczną listę Measures (to jest mój poziom 0), a następnie dynamiczny lista Threshold (poziom 1a ...) i dla każdego values1 do wyświetlenia próg 4, jeśli są! = 0

+0

Co ze składowaniem wielu podglądów gridviewrowner? To może być dobry sposób? Utknąłem w tym problemie ... – michele

+0

Czy możemy uzyskać lepsze wyobrażenie o tym, jak wygląda twój model/dane obiektu? – RQDQ

+0

@RQDQ Dodałem obiekt objectmodel muszę wyświetlić – michele

Odpowiedz

1

Jak o coś takiego:

<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> 

Być może trzeba przekonwertować wartość1 do właściwości VALUE2 kolekcja w celu dynamicznego wyświetlania wartości niezerowych i użycia tego samego podejścia ListBox/StackPanel, które służyło do wyświetlania progów.

Daje wyjście:

Screenshot

I właśnie aby zakończyć post, tutaj jest kod użyłem:

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

Dziękuję, wydaje się być dobrą wskazówką, spróbuję jak najszybciej! Moja jedyna wątpliwość polega na tym, że muszę użyć widoku listy, ponieważ konstruowany przeze mnie model obiektowy jest powtarzany dla n wiersza (reprezentującego n członka). Teraz używam prostszego rozwiązania (ponieważ terminy projektów nie czekają), ale wciąż szukam bardziej eleganckiego rozwiązania! – michele

+0

@michele - to podejście nadal działa dla obiektów o wielu miarach i wielu obiektów Threshold. Czy to właśnie próbujesz rozwiązać? – RQDQ

+0

Próbuję twojego przykładu kodu. Działa, ale muszę ustawić tę strukturę drzewa w nagłówku listy, wiersze w liście muszą wyświetlać tylko wartości najniższego poziomu. Twój przykład ustawia drzewo wewnątrz każdego wiersza i staram się go ominąć. Myślę, że jedynym rozwiązaniem jest napisanie pełnej kontroli niestandardowej. Jeszcze raz dziękuję – michele

0

Poziom 0 to listView? Poziom 1A i poziom 1b to Gridviews, które chcesz wewnątrz dwóch różnych szablonowych kolumn w widoku listy poziomu 0? Następnie poziom A i poziom b to dwa kolejne widoki siatki w 2 kolumnach z szablonem na poziomie 1a i poziomie 1b?

Możesz być w stanie przekształcić tę samą koncepcję tego zagnieżdżone GridView używa do WPF

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

nie próbowałem to sam w WPF, ale gridviews wydawało się być zbudowane podobnie. Po prostu używaj paneli zamiast DIV i mniej bólów głowy, mając na uwadze rozmowy o klientach/serwerach.

Również zestawy danych działają ładniej niż listy.

Oto kod psuedo w jaki sposób mam skonfigurować zagnieżdżone zestawów danych przed

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

Dziękuję bardzo za podpowiedź. Niestety praca z zagnieżdżonymi widokami siatki nie wydaje się być rozwiązaniem mojego problemu. Muszę mieć tylko jeden listview, który wyświetla najniższy poziom (lvl, lvlB): górne poziomy są tylko opisowe, potrzebuję ich, aby wiedzieć, do którego obiektu odnosi się lvlA. – michele

0

Czy myślałeś o tym, jak powinni zachowywać się - Twój nagłówek to jest?

Łatwo jest stworzyć nagłówek podobny do tego, który sugerujesz - możesz go skompilować z pewnymi programami - ale to tylko nagłówek. Czy powinieneś także zmienić rozmiar, tak jak zwykle, z nagłówkiem listview?

Może szukasz czegoś takiego jak TreeListView?

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

myślę, że to, co chciałbym iść po wyświetlać wielowymiarowych danych - jest łatwy do zrozumienia i zastosowania, gdzie zwyczaj ListView mogą być trudne do wdrożenia zachowywać prawo.

+0

dziękuję za podpowiedź. Kiedy mam trochę wolnego czasu, chcę spróbować tej kontroli! – michele

Powiązane problemy