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
Post a Comment