Avatar billede Slettet bruger
03. april 2010 - 11:38 Der er 9 kommentarer og
1 løsning

WPF: Bug i listview datacontext?

Det bliver lige på engelsk, da stackoverflows site er lige så talentløs som WPF.

When i populate the DataContext collection, which is a ObservableCollection with the type OverviewListItem bound to my listview, all works fine. But when i later update some properties of the OverviewListItem class, the listview does not update until i scroll to the bottom and up again, and only some items get updated. The only way i could get it to work was first removing the item from the collection, change the properties and add it again.


OverviewListCollection = new ObservableCollection<OverviewListItem>();
OverviewListview.DataContext = OverviewListCollection;


Adding the items at first:


OverviewListItem itm = new OverviewListItem();
itm.Image = dataItm == null ? null : dataItm.FlagImage;
itm.CurrencyCode = R.CurrencyCode;
itm.Description = R.Description == null ? string.Empty : R.Description;
itm.Rate = string.Empty;
itm.Date = string.Empty;
   
OverviewListCollection.Add(itm);


And the updating:


DailyRate foundRate = dailyRatesList.Find(delegate(DailyRate d) { return d.CurrencyCode == itm.CurrencyCode; });
    OverviewListItem foundItm = OverviewListCollection.First(delegate(OverviewListItem d) { return d.CurrencyCode == itm.CurrencyCode; });
       
OverviewListCollection.Remove(foundItm);
       
foundItm.Rate = CurrencyConverter.Convert(decimal.Parse(FromAmountBox.Text.Trim()), fromRate.DKKRate, foundRate.DKKRate).ToString("N");
foundItm.Date = foundRate.Date.ToShortDateString();
       
OverviewListCollection.Add(foundItm)


If i update without add/remove. It won't refresh the list. Is this a WPF bug? if so, i can post it on Microsoft Connect with all the other bugs i've ran into!!!
Avatar billede Syska Mester
03. april 2010 - 15:31 #1
Du skal også implementere IPropertyChanged på din klasse.

Kunne i hvert fald være en ide, alt efter hvordan din klasse ser ud ...

Gerne post kode for din egen klasse ...

Går ud fra at "OverviewListCollection" bare er navnet på din ObserableCollection
Avatar billede Syska Mester
03. april 2010 - 15:33 #2
Men hvad virker ikke på Stackoverflow? Synes mere i den her sammenhæng at EXP er talentløs og mangelfuld

Snakken om WPF har vi haft før ... et produkt du bestmet ikke er glad for :-) *heheh*

mvh
Avatar billede Slettet bruger
03. april 2010 - 19:43 #3
uanset hvad jeg gjorde kunne jeg ikke poste et emne, da den sagde mine tags var forkerte...

Jeg har anmeldt lidt forskellige bugs til MS efterhånden og endte med at snakke direkte med projekt lederen af WPF teamet. Så der er noget om snakken ;o)

Min klasse ser således ud:
public class OverviewListItem
    {
        public ImageSource Image { get; set; }
        public string CurrencyCode { get; set; }
        public string Description { get; set; }
        public string Date { get; set; }
        public string Rate { get; set; }
    }

Men det ville undre mig meget hvis alle objekter der tilføjes i en ObserableCollection skal implementere IpropertyChanged for at virker korrekt.
Avatar billede Syska Mester
03. april 2010 - 20:16 #4
hmmm, bruger ikke SO så tit ... kun når jeg googler og kommer derind :-P

Der er jo bugs i alt ... du har bare været heldig at finde dem? Er det noget du ved om bliver rettet i .NET 4? og har du links til de bugs ... kunne være meget sjov læsning.

Så vidt jeg lige ved ... så bliver du nød til det. Hvordan kan dine Textbox, Listbox, DropDownList etc. vide om der er sket ændringer i dine properties i din collection ?

Det er vel reelt set 2 lister med objecter i ... så vi mangler det sidste step for at din UIElements kan opdatere deres værdi ... de skal jo netop have at vide at de har ændret værdi. Grunden til at det nok virker ved at fjerne et element og tilføje det igen, må være at den laver en hel ny bind, og sætter alle properties igen.

Igen ... jeg er ik' sikker, men er ret overbevist om det er det Interface du mangler. Mindes også der skulle være et interface mere som UIElement kigger på hvis objectet man binder til arver fra det.

Håber du får det til at virke.

mvh
Avatar billede Slettet bruger
03. april 2010 - 22:18 #5
Jeg prøver med IPropertyChanged. Så besværligt er det heller ikke. Der er bare ikke nogen der skal komme og sige WPF er smart. Smart, det er det ikke, lige bortset fra styling og look and feel.

Jeg har posted ét emne på Microsoft Connect, resten er taget direkte over mail med Mark.

https://connect.microsoft.com/VisualStudio/feedback/details/539808/embarrassing-limitations-in-wpf

Der er bla fejl i focus af elementer når man åbner nye vinduer. TextBox har også nogle problemer med GetLineIndex og Lines (count) (tror jeg nok de hedder). Den returnere ikke korrekte værdier.


Jeg er ved at konvertere vores nye software der endnu ikke er released. Det har været under udvikling længe og jeg valgte at portere det til WPF da vi ønskede et anderledes look, video afspilning osv. Lige præcis det er jo nogle af WPF's stærke sider.
Avatar billede Slettet bruger
03. april 2010 - 22:23 #6
Det er bare en kamp uden lige at få tingene til at virke. Man bruger MEGET længere tid på at udvikle sin UI mod sin codebehind kode end med WinForms. Man skal konstant finde omveje og ulogiske løsninger på ofte meget simple problemer. Tag f.eks et gif billede. Dette understøtter WPF ikke. Her skal man enten ud i nogle UserControls der ofte ikke fungere særlig godt, eller benytte WinForms controls i WPF, hvilket lyder som en ulækker løsning.
Et andet eksempel er en NumericUpDown control. Dette har WPF heller ikke. Så man skal bruge lang tid på selv at udvikle disse fuldstændig banale controls som man ellers er vant til at have.

Alt dette er blot et lille eksempel på hvorfor WPF ikke er klar til "avancerede" projekter. Hvis du blot skal lave simple standard projekter, så er det somregel ikke noget problem.
Avatar billede Syska Mester
03. april 2010 - 22:30 #7
Hej,

Advancerede projekter kan jeg ikke forholde mig til, da vi nok ville skulle have en defination ind her, hvornår vi vil kategorisere det i den gruppe.

Men binding i WinForms synes jeg til tider er ligeså dum som i WPF. Måske fordi jeg ikke har brugt WinForms nok, så i sidste ende tror jeg det er et spørgsmål om at man skal kende begge godt.

Jeg synes personligt, at WPF har et høj læringskurve, før man fatter en skid af hvad der foregår, men WinForms er mere out of the box.

Men igen ... intet er perkekt, men jeg mener bestemt WPF er klar til produktion.

mvh
Avatar billede Slettet bruger
03. april 2010 - 22:38 #8
Helt sikkert, WPF tager noget længere tid og lærer, om det er godt eller skidt kan jo diskuteres. Programmering skal heller ikke blot være drag & drop ;)

Når jeg siger "avancerede" projekter mener jeg ikke små projekter med et par forms og nogle standard kontroller og så har man lavet en lommeregner, men hvor man virkelig kommer i dybden med brug af kontroller på tværts, merging af menuer (hvilket WPF heller ikke kan, korrekt), stort brug af custom controls, libraries, localization osv.
Avatar billede Slettet bruger
03. april 2010 - 22:43 #9
Smid mig lige din mail eller tilføj mig på msn, Lasse-Offt (at) "varmmand".com :)
Avatar billede Syska Mester
03. april 2010 - 22:47 #10
Præcis min tanke ... WPF gør mange ting, men deres Intellisense er wag ... eller ikke eksisterende :-)

Ja okay, så er jeg mere med ... og Menu og MenuItems :-s ... ARGH, ja, den mangler også ting som jeg ville mene logisk set burde være der ... men ej.

og svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester