wpf - ObservableCollection not update my UI -


this model:

public class wiresharkfile : inotifypropertychanged {     public event propertychangedeventhandler propertychanged;      virtual public void notifypropertychange(string propertyname)     {         var handler = propertychanged;         if (handler != null)             handler(this, new propertychangedeventargs(propertyname));     }     private string _file; // file path    private string _packets; // how many packet in file    private string _sentpackets; // how many packet sent    private string _progress; // percentage (_sentpackets/_packets) * 100     public int progress    {        { return _progress; }        set        {            _progress = value;            notifypropertychange("progress");        }    }     public void transmit(wireshrkfile)    {          // here send packets    }      public event propertychangedeventhandler propertychanged;      virtual public void notifypropertychange(string propertyname)     {         var handler = propertychanged;         if (handler != null)             handler(this, new propertychangedeventargs(propertyname));     } } 

my model collection:

public observablecollection<wireshrkfile> files{ get; set; } 

my listview:

    <listview name="lvfiles" margin="16,455,0,65" background="transparent" borderthickness="0,1,0,1"                itemssource="{binding pcapfiles}" mousedoubleclick="lvpcapfiles_mousedoubleclick"                mousedown="lvpcapfiles_mousedown" mouseleftbuttondown="lvpcapfiles_mouseleftbuttondown" >         <listview.itemcontainerstyle>             <style targettype="{x:type listviewitem}">                 <setter property="foreground" value="white"/>                 <setter property="snapstodevicepixels" value="true"/>                 <setter property="padding" value="4,1"/>                 <setter property="horizontalcontentalignment" value="{binding horizontalcontentalignment, relativesource={relativesource ancestortype={x:type itemscontrol}}}"/>                 <setter property="background" value="transparent"/>                 <setter property="borderbrush" value="transparent"/>                 <setter property="borderthickness" value="1"/>                 <setter property="focusvisualstyle" value="{x:null}"/>                 <style.triggers>                     <multitrigger>                         <multitrigger.conditions>                             <condition property="ismouseover" value="true"/>                         </multitrigger.conditions>                         <setter property="foreground" value="black"></setter>                         <setter property="background" value="#ffd8d5d5"/>                         <setter property="borderbrush" value="white"/>                     </multitrigger>                     <multitrigger>                         <multitrigger.conditions>                             <condition property="selector.isselectionactive" value="false"/>                             <condition property="isselected" value="true"/>                         </multitrigger.conditions>                         <setter property="background" value="#ff15669e"/>                         <setter property="foreground" value="white"/>                         <setter property="borderbrush" value="transparent"/>                         <setter property="borderthickness" value="0"/>                     </multitrigger>                     <multitrigger>                         <multitrigger.conditions>                             <condition property="selector.isselectionactive" value="true"/>                             <condition property="isselected" value="true"/>                         </multitrigger.conditions>                         <setter property="background" value="#ff15669e"/>                         <setter property="foreground" value="white"/>                         <setter property="borderbrush" value="transparent"/>                         <setter property="borderthickness" value="1"/>                     </multitrigger>                     <trigger property="isenabled" value="false">                         <setter property="textelement.foreground" value="{dynamicresource {x:static systemcolors.graytextbrushkey}}"/>                     </trigger>                 </style.triggers>             </style>         </listview.itemcontainerstyle>         <listview.resources>             <datatemplate x:key="mydatatemplate">                 <grid margin="-6">                     <progressbar name="progressbarcolumn" maximum="100" value="{binding progress}"                                   width="{binding path=width, elementname=progresscell}"                                   height="20" margin="0" background="gray" style="{staticresource customprogressbar}" />                     <textblock text="{binding path=value, elementname=progressbarcolumn, stringformat={}{0}%}" verticalalignment="center"                                horizontalalignment="center" fontsize="11" foreground="white" />                 </grid>             </datatemplate>             <controltemplate x:key="progressbartemplate">                 <label  horizontalalignment="center" verticalalignment="center" />             </controltemplate>         </listview.resources>         <listview.view>             <gridview columnheadercontainerstyle="{staticresource listviewheaderstyle}">                 <!-- file name column -->                 <gridviewcolumn width="420" header="file name" displaymemberbinding="{binding filename}" />                  <!-- duration column -->                 <gridviewcolumn width="60" header="duration" displaymemberbinding="{binding duration}" />                  <!-- packets column -->                 <gridviewcolumn width="80" header="packets" displaymemberbinding="{binding packets}" />                  <!-- packet sent -->                 <gridviewcolumn width="80" header="packet sent" displaymemberbinding="{binding packetssent}" />                  <!-- progress column -->                 <gridviewcolumn x:name="progresscell"  width="50" header="progress" celltemplate="{staticresource mydatatemplate}" />             </gridview>         </listview.view>         <listview.contextmenu>             <contextmenu>                 <menuitem header="open capture" fontsize="12" fontfamily="microsoft sans serif"                               click="menuitem_click" verticalalignment="center" height="20">                     <menuitem.icon>                         <image height="18" width="18" verticalalignment="center"                                source="c:\users\rsteinbe\dropbox\packetplayer\packetplayer\resources\wireshark.ico" />                     </menuitem.icon>                 </menuitem>             </contextmenu>         </listview.contextmenu>     </listview> 

i can see collection properties changing mu ui not.

note: pay attention here: itemssource="{binding wiresharkfile}"

change itemssource="{binding files}"

i've prepared small sample:

window x:class="progressbarchangedstack.mainwindow"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     title="mainwindow" height="350" width="525"> <grid>     <stackpanel>         <listview itemssource="{binding files}">             <listview.itemtemplate>                 <datatemplate>                     <stackpanel orientation="horizontal">                         <label content="progress: "/>                         <progressbar value="{binding progress}" margin="5" minwidth="100"/>                     </stackpanel>                 </datatemplate>             </listview.itemtemplate>         </listview>         <button content="click complete progress" width="150" margin="10" click="btnprogresscomplete_click"/>     </stackpanel> </grid> 

simple view, have progressbar there value bound property model.

this model:

public class model : inotifypropertychanged {     private int _progress;      public int progress     {         { return _progress; }         set         {             _progress = value;             propertychanged(this, new propertychangedeventargs("progress"));         }     }     public event propertychangedeventhandler propertychanged = delegate { }; } 

i think there nothing explain here, have same approach.

and here testing code:

 public partial class mainwindow : window {     public observablecollection<model> files { get; set; }      public mainwindow()     {         initializecomponent();         files = new observablecollection<model>();         files.add(new model() { progress = 20 });         files.add(new model() { progress = 30 });         files.add(new model() { progress = 40 });         this.datacontext = this;     }      private void btnprogresscomplete_click(object sender, routedeventargs e)     {         foreach (var file in files)         {             file.progress = 100;         }     } } 

so, when click button, progressbars complete.

i see don't have inpc implemented these properties:

  private string _file; // file path   private string _packets; // how many packet in file   private string _sentpackets; // how many packet sent   private string _progress; // percentage (_sentpackets/_packets) * 100 

with actual form, view not inform when changes occur.


Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -