[c# WPF] Presentatie ListView wijzigen middels DataTemplate

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • skate master
  • Registratie: September 2004
  • Laatst online: 20:40

skate master

Autodesk Educator Expert

Topicstarter
In mijn plugin maak ik gebruik van een ListView om hierin data uit een database weer te geven.
De data wordt middels databinding aan de juiste kolommen gekoppeld.

verschillende weergaven
Afhankelijk van het gekozen data format wil ik de weergave van mijn ListView wijzigen.
WPF is voor mij nieuw, en na het nodige zoekwerk en testen heb ik eigenlijk nog niet bereikt wat ik wil bereiken.

Wat ik gevonden heb is dat dat wat ik wil via DataTemplates mogelijk is, echter krijg ik het niet werkend.

Wat ik denk dat de juiste oplossingsrichting is
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    <Window.Resources>
        <DataTemplate x:Key="template1">
            <GridView>
                <GridViewColumn Header="" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Image Source="{Binding Path=Icon}" Width="64" Height="64"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Soort" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Label Width="200" Margin="5, 0" Content="{Binding Path=Name}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Status" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Label Width="100" Margin="5, 0" Content="{Binding Path=Status}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </DataTemplate>
        <DataTemplate x:Key="template2">
            <GridView>
                <GridViewColumn Header="Eerste kolom" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Label Width="200" Margin="5, 0" Content="{Binding Path=Name}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Image Source="{Binding Path=Icon}" Width="64" Height="64"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Laatste kolom" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Label Width="100" Margin="5, 0" Content="{Binding Path=Status}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListView x:Name="mylist" HorizontalAlignment="Left" Height="405" Margin="7,4,0,0" VerticalAlignment="Top" Width="520">
            
        </ListView>
    </Grid>

Bovenstaande is slechts een test waarbij de twee templates slechts verschillen in de volgorde van de kolommen.
In de achterliggende code zou ik dan met onderstaande een template moeten kunnen toekennen.
C#:
1
mylist.ItemTemplate = (DataTemplate)this.TryFindResource("template2");

Bij het uitvoeren krijg ik echter een error.
code:
1
The root of a Template content section cannot contain an element of type 'System.Windows.Controls.GridView'. Only FrameworkElement and FrameworkContentElement types are valid.

De error verwijst naar <GridView> in miijn template en blijkbaar hoort dit daar niet.
Haal ik echter <GridView> weg dan krijg ik de error "The property "Visual Tree" can only be set once".
Hieruit maak ik op dat ik maar 1 <GridViewColumn> in mijn template mag hebben, maar dat is nou net niet wat ik wil.

Waar ga ik fout?
Ergens pas ik de principes van de Templates niet goed toe / heb ik iets niet goed begrepen.
Ik kom er echter zelf niet uit wat ik nu mis.

Wie kan mij vertellen wat ik moet veranderen of waar ik de juiste info kan vinden om mijn einddoel te bereiken?

Beste antwoord (via skate master op 22-03-2021 14:33)


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Ook zonder de Resources krijg ik die fout. ItemTemplate werkt wel met een Label, maar dus niet met een GridView.

In dit voorbeeld bouwen ze de xaml iets anders op. Namelijk zo:
XML:
1
2
3
4
5
<ListView Margin="10" Name="lvUsers">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" >
                 <!-- ... -->

Je Resources bouw je dan zo op:
XML:
1
2
3
4
<Window.Resources>
    <GridView x:Key="template1">
        <GridViewColumn Header="" Width="Auto">
             <!-- ... -->


en in code doe je:
C#:
1
mylist.View = (ViewBase)this.TryFindResource("template2");


Waarom dit wel werkt? Geen idee.

[ Voor 14% gewijzigd door Daos op 19-03-2021 23:06 . Reden: Verduidelijking ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Je antwoord zou hier weleens kunnen staan:
https://stackoverflow.com...ree-is-set-more-than-once

Systeem | Garmin Connect


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Ook zonder de Resources krijg ik die fout. ItemTemplate werkt wel met een Label, maar dus niet met een GridView.

In dit voorbeeld bouwen ze de xaml iets anders op. Namelijk zo:
XML:
1
2
3
4
5
<ListView Margin="10" Name="lvUsers">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" >
                 <!-- ... -->

Je Resources bouw je dan zo op:
XML:
1
2
3
4
<Window.Resources>
    <GridView x:Key="template1">
        <GridViewColumn Header="" Width="Auto">
             <!-- ... -->


en in code doe je:
C#:
1
mylist.View = (ViewBase)this.TryFindResource("template2");


Waarom dit wel werkt? Geen idee.

[ Voor 14% gewijzigd door Daos op 19-03-2021 23:06 . Reden: Verduidelijking ]


Acties:
  • 0 Henk 'm!

  • skate master
  • Registratie: September 2004
  • Laatst online: 20:40

skate master

Autodesk Educator Expert

Topicstarter
@Daos bedankt voor je input.
Dit is inderdaad een manier die werkt en voor mij ook prima werkbaar is.
Deze wijze van opbouwen was ik nog niet tegen gekomen, weer wat geleerd.