Wpf Datatemplate

0

Witam, mam następujący problem, w XAML-u utworzyłem szablon danych

<Window.Resources>
        <DataTemplate x:Key="dt">
            <StackPanel>
                <ListView ItemsSource="{Binding lista}">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
                            <GridViewColumn Header="Surname" DisplayMemberBinding="{Binding Surname}"/>
                            <GridViewColumn Header="Destination" DisplayMemberBinding="{Binding Destination}"/>
                            <GridViewColumn Header="Date" DisplayMemberBinding="{Binding Date}"/>
                        </GridView>
                    </ListView.View>
                </ListView>
            </StackPanel>
        </Window.Resources> 

Odwołuję się do niego w Datagridzie w RowDetailsTemplate, lecz oprócz nazw kolumn nie ma wartości w wierszach jakby nie był w stanie przeczytać ich.

  <DataGrid  Name="datagrid"  ItemsSource="{Binding nowy}" RowDetailsTemplate="{StaticResource dt}" >
                <DataGrid.Columns>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Expander Name="expander" IsExpanded="False" Collapsed="sw" Expanded="pos"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns> 

Zawartość szablonu danych wklejona do zwykłego kodu działa poprawnie(pokazuje wiersze z wartościami).

0

Tworzysz szablon danych który wrzucasz do szablonu RowDetailsTemplate który określa w jaki sposób dane mają się pokazywać w wierszach. Przynajmniej ja to tak widzę ale nie jestem w stanie tego sprawdzić dokładnie bo nie wiem co się kryje pod tymi "sw", "pos".

0

Ok, przedstawię to nieco inaczej. Głównym zamysłem było rozwiązanie bindowania wewnątrz RowDetailsTemplate. Bindowanie w pierwszym Datagridzie działa poprawnie, lecz w tym zdefiniowanym w RowDetailsTemplate już nie:

XAML:

  <DataGrid  Name="datagrid"  Margin="5,0,5,0" GridLinesVisibility="None" CanUserAddRows="False" ItemsSource="{Binding nowy}" >
                <DataGrid.Columns>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Expander Name="expander" IsExpanded="False" Collapsed="sw" Expanded="pos"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <DataGrid ItemsSource="{Binding flight_list}"/>
                        </StackPanel>
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid>
           
        </StackPanel>
    </Grid> 

C#:

 public ObservableCollection<flight> flight_list { get; set; }
    public ObservableCollection<subject> nowy { get; set; }
nowy = new  ObservableCollection<subject>() {
            {new subject(){ Przedmiot = "J.angielski", Nauczyciel = "B.A.Krawczyk", Sala = "120", Poziom = "Średnio-zaawansowany", Status = "Uczeń"}},
            { new subject(){Przedmiot = "polski", Nauczyciel = "zły", Sala = "130", Poziom = "podstawowy", Status = "gey"}}
        };
 flight_list = new ObservableCollection<flight>(){new flight(){From = "Warsaw", To = "Florida", schedule = new List<string>(){"12-02-2013", "12-03-2012", "31-2"}}};
 DataContext = this; 

W przypadku bindowania w RowDetailsTemplate nie wiem w jaki sposób odwołać się do flight_list, gdyż nadal binduje do obiektu typu subject(zamieniając

  <DataGrid ItemsSource="{Binding flight_list}"/>

na <Label Content={Binding}

 wyświetli mi nazwę obiektu typu subject).
0

Coś się tak uparła to DataGrid.RowDetailsTemplate używasz tego źle poczytaj w ogóle do czego to służy. Ale następna sprawa co ma lista lotów do przedmiotów.

0

Bez znaczenia do czego się odwołuje i wiem do czego służy. Zamysł był taki jak bindować do innej właściwości. Pierwszy Datagrid binduje do "nowy" i tam ten drugi DataGrid domyślnie też tam binduje a chciałem żeby do innej.

0
mariusz_wiersz napisał(a):

XAML:

  <DataGrid  Name="datagrid"  Margin="5,0,5,0" GridLinesVisibility="None" CanUserAddRows="False" ItemsSource="{Binding nowy}" >
                <DataGrid.Columns>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Expander Name="expander" IsExpanded="False" Collapsed="sw" Expanded="pos"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <DataGrid ItemsSource="{Binding flight_list}"/>
                        </StackPanel>
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid>
           
        </StackPanel>
    </Grid> 

Noto wytłumacz mi ten zapis bo ja to widzę następująco ale mogę się mylić to mi wyjaśnisz.
A więc tworzysz data grida dodajesz do niego kolekcje "nowy". Później tworzysz własny szablon dla komórki i walisz tam expandera który jest pusty no chyba że w kodzie masz drugą część kodu dla niego ale sam fakt takiego rozrzucania po kodzie wydaje się bez sensu. No ale idźmy dalej teraz tworzysz SZABLON DLA WIERSZA i zamiast poustawiać co ma się tam pokazywać i w jakiej formie z kolekcji którą podpoiłeś do grida ("nowy") walisz tam innego grida z nową kolekcją zamiast ustawić szablon wyświetlania dla kolekcji którą już masz podpiętą.

No ale wiesz co do czego służy.

EDIT:

Aha i jak chcesz żeby to tak zadziałało to do kolekcji "nowy" wrzuć kolekcje "flight_list" i wtedy się odwołuj.

0

Z tym wrzuceniem flight_list to wiem, ale zamysł był taki, że nowy reprezentuje np. studentów a filght_list np. informacje o szkole znajdujące się w innej liście(trochę z nazwami namieszałem). Wkładanie tych informacji do studenta byłoby raczej nieodpowiednie stąd chcę się dostać do takiej listy, masz pomysł jak?

0

Okej rozumiem da to się łatwo robić tylko powkładałeś to w złe miejsca. Ja bym dał comboboxa z możliwością wyboru lub włożył datagrida w którym po wybraniu opcji pojawił by się drugi datagrid z listą.

Datagrid w datagridzie przyklad: http://4programmers.net/Forum/C_i_.NET/214259-binding_miedzy_obiektem_i_datagrid?p=936609#id936609
Albo z comboboxem : http://www.c-sharpcorner.com/uploadfile/dpatra/combobox-in-datagrid-in-wpf/

1 użytkowników online, w tym zalogowanych: 0, gości: 1