2010-09-23 8 views
8

Ich habe ein Ansichtsmodell, das als Datenquelle für mein benutzerdefiniertes Steuerelement verwendet wird. Im Konstruktor des View-Modells habe ich ein WMI ManagementEventWatcher eingerichtet und starte es. Mein Ansichtsmodell implementiert IDisposable, also stoppe ich den Watcher in der Dispose-Methode.Wie wird das Ansichtsmodell richtig aufgeräumt?

Wenn ich das benutzerdefinierte Steuerelement in ein Fenster einbetten und dann das Fenster schließen, um die Anwendung zu beenden, wird ein InvalidComObjectException mit der Aussage "COM-Objekt, das von seinem zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden". Dies geschieht wegen meines Beobachters, und wenn ich es nicht erstelle, gibt es keine Ausnahme. Es gibt keine zusätzlichen Informationen über die Ausnahme wie Stack-Trace, usw.

Meine Vermutung ist, dass etwas das Ansichtsmodell hält, bis der Thread, den der Beobachter verwendet, endet, aber bevor der Beobachter gestoppt wird, und ich weiß nicht wie geh damit um.

Irgendwelche Ratschläge? Dank Konstantin

public abstract class ViewModelBase : IDisposable, ... 
{ 
    ... 

    protected virtual void OnDispose() { } 

    void IDisposable.Dispose() 
    { 
     this.OnDispose(); 
    } 
} 

public class DirectorySelector : ViewModelBase 
{ 
    private ManagementEventWatcher watcher; 

    private void OnWMIEvent(object sender, EventArrivedEventArgs e) 
    { 
     ... 
    } 

    protected override void OnDispose() 
    { 
     if (this.watcher != null) 
     { 
      this.watcher.Stop(); 
      this.watcher = null; 
     } 
     base.OnDispose(); 
    } 

    public DirectorySelector() 
    { 
     try 
     { 
      this.watcher = new ManagementEventWatcher(new WqlEventQuery(...)); 

      this.watcher.EventArrived += new EventArrivedEventHandler(this.OnWMIEvent); 
      this.watcher.Start(); 
     } 
     catch (ManagementException) 
     { 
      this.watcher = null; 
     } 
    } 
} 
+0

wäre schön zu wissen, mit welcher Sprache Sie arbeiten;) aber trotzdem ... ein "View-Modell"? klingt wie du bist mischt Dinge, die wirklich getrennt sein sollten ... –

+0

ich benutze C#. Ich arbeite an einem Verzeichnis-Selektor-Steuerelement für WPF, und dieses Steuerelement muss Laufwerk Mounts und Unmounts und CD-ROM-Einfügungen/Entnahmen behandeln können. Da MVVM die bevorzugte Möglichkeit ist, die Benutzeroberfläche vom Code zu trennen, verwende ich ein Ansichtsmodell, das die Liste der Laufwerke, Verzeichnisse usw. zurückgibt und die Laufwerke überwacht. – akonsu

Antwort

4

dieser Artikel hat die Lösung: Disposing WPF User Controls

im Grunde, WPF dos nicht IDisposable scheint überall zu verwenden, so dass die App muss Bereinigung selbst explizit. In meinem Fall abonniere ich das Dispatcher.ShutdownStarted-Ereignis von meinem Steuerelement, das das zu entsorgende Anzeigemodell verwendet, und entsorgt den DataContext des Steuerelements aus dem Ereignishandler.

Verwandte Themen