Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XAML] Alternatief voor Json-query

Pagina: 1
Acties:

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 19-11 21:48
Ik gebruik nu onderstaande code om myListView van data te voorzien.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
Dim myItems As JsonArray = root.GetNamedArray("myItems")
Dim Results = (
                From item In myItems
                Select New With
                        {
                        .item1 = item.GetObject()("Item1").GetString(), _
                        .item2 = item.GetObject()("Item2").GetString()
                        }
                )
myListView.ItemsSource = Results

Nu wil ik ipv de query een 'For Each item in myItems' toepassen zodat ik de items nog kan bewerken voordat ik ze aan myListView koppel.

Ik had zoiets in gedachten:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
Dim myItems As JsonArray = root.GetNamedArray("myItems")
Dim Results as ???
For Each item in myItems
    Dim item1 as string =  item.GetObject()("Item1").GetString()
    If item1 = "blaat" Then
        item1 = "Nieuwe blaat"
    End If
    Results.Add("item1", item1)
    Results.Add("item2", item.GetObject()("Item2").GetString())
Next
myListView.ItemsSource = Results

Wat voor object type moet ik toepassen om bovenstaande voor elkaar te krijgen?

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat heb je zelf al bedacht? Je kunt natuurlijk een willekeurige collectie gebruiken.

Een Array,List,ArrayList of een ObservableCollection zullen allemaal waarschijnlijk wel voldoen. Probeer eens zelf te berendeneren welke je goed zou kunnen gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 19-11 21:48
Ik heb onderstaande geprobeerd. Hiermee blijft mijn listview leeg. Ik ben nog te onbekend met deze materie...
Visual Basic .NET:
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
Dim Results As New List(Of myItem)
For Each Item In myItems
    Results.Add(New myItem("item1", Item.GetObject()("Item1").GetString()))
    Results.Add(New myItem("item2", Item.GetObject()("Item2").GetString()))
Next
lstvwIngredients.ItemsSource = Results

'-----------------------------------------------------------------------------------------------------------------

Public Class myItem
    Private _key As String
    Private _value As String

    Public Sub New(ByVal key As String, ByVal value As String)
        Me._key = key
        Me._value = value
    End Sub

    Public Property key() As String
        Get
            Return Me._key
        End Get
        Set(ByVal value As String)
            Me._key = value
        End Set
    End Property

    Public Property value() As String
        Get
            Return Me._value
        End Get
        Set(ByVal value As String)
            Me._value = value
        End Set
    End Property

End Class


Edit:

Visual Basic .NET:
1
2
3
4
Dim Results As New List(Of KeyValuePair(Of String, String))
Results.Add(New KeyValuePair(Of String, String)("item1", "item1 test"))
Results.Add(New KeyValuePair(Of String, String)("item2", "item2 test"))
lstvwIngredients.ItemsSource = Results

Ik dacht met key-value te werken, maar ook dit werkt niet...

[ Voor 14% gewijzigd door Swerfer op 06-12-2012 13:04 ]

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
In principe kan je elk willekeurig collectie die IEnumerable implementeerd gebruiken voor een ItemsSource, ik denk dat het probleem dan ook niet in de getoonde code zit, maar dat je XAML/Template niet goed is, of dat je code die je hier toont niet overeen komt met wat er daadwerkelijk uitgevoerd wordt.

Overigens verschilt je code die je initieel had natuurlijk ook nog van de code die je nu hebt ( In je eerste voorbeeld heb je 1 (anonymous type) object met de properties item1 en item2 ), nu heb je 2 objecten met de key's item1 en item2.

[ Voor 28% gewijzigd door Woy op 06-12-2012 13:03 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • BM
  • Registratie: September 2001
  • Nu online

BM

Moderator Spielerij
Wat je daar gemaakt hebt is volgens mij een summiere kopie van een Dictionary.

Waarschijnlijk bind je in je XAML aan een lijst van objecten, waarbij die objecten een property item1, en item2 moeten hebben. Dat is niet wat je met 2e codevoorbeeld in de TS, of het voorbeeld hierboven bereikt.

Je zou een class (MyItem) kunnen maken die de juiste properties exposed (item1 en item2), in je foreach loop de checks doen doe je wilt, en dan met de juiste waarden een nieuwe instantie van MyItem aanmaken. Die sla je op in een lijst, en die kun je dan vervolgens binden aan je ListView.

Als de checks heel simpel zijn (zoals je beschrijft in je voorbeeld) zou je in C# dat zelfs nog op kunnen lossen met een simpele ternary operator, maar wat ik zo snel op google vind is die er niet echt voor VB.Net

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 19-11 21:48
Woy schreef op donderdag 06 december 2012 @ 13:01:
Overigens verschilt je code die je initieel had natuurlijk ook nog van de code die je nu hebt ( In je eerste voorbeeld heb je 1 (anonymous type) object met de properties item1 en item2 ), nu heb je 2 objecten met de key's item1 en item2.
Dat is een goeie. Ik ga weer aan de gang...

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 19-11 21:48
Ik zit nu helemaal vast. Hoe kan ik één object maken waaraan ik 2 key-value properties toeken? Of zit ik nu helemaal in de verkeerde richting te denken?
Visual Basic .NET:
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
Dim item1 as string = Item.GetObject()("Item1").GetString()
If Item1 = "blaat" Then
    item1="Nieuwe blaat"
End If
Results.Add(New myItem() With { _
    .item1 = item1, _
    .item2 = Item.GetObject()("Item2").GetString() _
    })

'------------------------------------------------------------------------------------

Public Class myItem 
    Private _key As String 
    Private _value As String 

    Public Property key() As String 
        Get 
            Return Me._key 
        End Get 
        Set(ByVal value As String) 
            Me._key = value 
        End Set 
    End Property 

    Public Property value() As String 
        Get 
            Return Me._value 
        End Get 
        Set(ByVal value As String) 
            Me._value = value 
        End Set 
    End Property 

End Class


Bedankt voor het op weg helpen!

[ Voor 82% gewijzigd door Swerfer op 06-12-2012 15:20 ]

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ja je zit in de verkeerde richting te denken. In je initiele voorbeeld heb je namelijk helemaal geen 2 key/value pairs maar een anoniem object die voldoet aan de volgende signature.
C#:
1
2
3
4
5
public class MyType
{
    public string item1 { get; set; }
    public string item2 { get; set; }
}

Het probleem is dat je een static typed list geen anonymous type als type parameter mee kunt geven. Dus je zult zelf een type moeten declareren zodat je een collectie met dat type items aan kunt maken.

Dan kan je iets maken als volgt
C#:
1
2
3
4
5
6
var myList = new List<MyType>();
myList.Add(new MyType
                {
                    item1 = "test",
                    item2 = "test2"
                });

Dan heb je dus een lijst met objecten van type MyType. MyType heeft 2 properties ( item1, item2 ). Dat is dan vergelijkbaar met de code die je eerst had.

Bij de constructie met "new" waar je geen type aangeeft zal de compiler onderwater namelijk ook gewoon een type definieren, het probleem is dat je daar niet aan kan refereren omdat je de naam niet weet ( Die genereert de compiler namelijk ). Dat omzeil je daarna gewoon door expliciet zelf een type te definieren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • BM
  • Registratie: September 2001
  • Nu online

BM

Moderator Spielerij
Visual Basic .NET:
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
Dim myItems As JsonArray = root.GetNamedArray("myItems") 
Dim Results As New List(Of myItem) 
For Each item in myItems 
    Dim item1 as string =  item.GetObject()("Item1").GetString() 
    Dim item2 as string =  item.GetObject()("Item2").GetString() 

    If item1 = "blaat" Then 
        item1 = "Nieuwe blaat" 
    End If 
    Dim itemObj as myItem = new myItem(item1, item2)
    Results.Add(itemObj)
Next 
myListView.ItemsSource = Results

Public Class myItem 
    Private _item1 As String 
    Private _item2 As String 

    Public Sub New(ByVal item1 As String, ByVal item2 As String) 
        Me._item1 = item1
        Me._item2 = item2
    End Sub 

    Public Property item1() As String 
        Get 
            Return Me._item1 
        End Get 
        Set(ByVal value As String) 
            Me._item1 = value 
        End Set 
    End Property 

    Public Property item2() As String 
        Get 
            Return Me._item2
        End Get 
        Set(ByVal value As String) 
            Me._item2 = value 
        End Set 
    End Property 
End Class



Is dit niet gewoon wat je zoekt?

Geen idee of het volledig correct is, mijn VB.Net is roestig

Edit: Wat Woy eigenlijk ook al zegt dus :)

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 19-11 21:48
Hmm, ik had het net zelf uitgevolgeld. In ieder geval bedankt voor het op weg helpen!

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com

Pagina: 1