.net - How to handle c# WPF thread in MVVM view model -


i having bear of time figuring out how handle thread class outside viewmodel.

the thread originates track class. here responseeventhandler code in track:

public delegate void responseeventhandler(abstractresponse response); public event responseeventhandler onresponseevent; 

when "command" method processed within track object, following code runs onresponseevent, sends message in thread viewmodel:

if (onresponseevent != null) {     onresponseevent(getresponsefromcurrentbuffer()); } 

getresponsefromcurrentbuffer() merely returns message type pre-defined type within track.

my mainwindowviewmodel constructor creates event handler onresponseevent track:

public mainwindowviewmodel() {     track _track = new track();      _track.onresponseevent +=         new track.responseeventhandler(updatetrackresponsewindow); } 

so, idea every time have new message coming onresponseevent thread, run updatetrackresponsewindow() method. method append new message string observablecollection<string> list property called trackresponsemessage:

private void updatetrackresponsewindow(abstractresponse message) {     trackresponsemessage.add(formatmessageresponsetostring(message)); } 

the formatmessageresponsetostring() method merely compares message pre-defined message types within track, , nifty string formatting.

the main problem is: the ui disappears when trackresponsemessage.add() run. executable still running in background, , way end task shut down visual studio 2010.

trackresponsemessage public property within viewmodel:

public observablecollection<string> trackresponsemessage {     { return _trackresponsemessage; }     set     {         _trackresponsemessage = value;         raisepropertychanged("trackresponsemessage");     } } 

is there need me marshal thread coming track object viewmodel? example code appreciated!

is there need me marshall thread comming track.cs object viewmodel? example code appreciated!

yes. unfortunately, while inotifypropertychanged handle events other threads, inotifycollectionchanged not (ie: observablecollection<t>). such, need marshal vm.

if vm being create view (view-first mvvm) or known created on ui thread, there's option using .net 4 tasks:

taskscheduler uischeduler; public mainwindowviewmodel()  {     uischeduler = taskscheduler.fromcurrentsynchronizationcontext();     track _track = new track();     _track.onresponseevent += new track.responseeventhandler(updatetrackresponsewindow); } 

then, later, event handler can do:

private void updatetrackresponsewindow(abstractresponse message)  {     task.factory.startnew(        () => trackresponsemessage.add(formatmessageresponsetostring(message)),        cancellationtoken.none, taskcreationoptions.none,        uischeduler);  } 

this has nice advantage of not pulling wpf or silverlight specific resources , types viewmodel class (ie: dispatcher), while still providing of benefits. works, unchanged, in other routines thread affinity (ie: wcf service work).


Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -