2010-01-30 9 views
5

In meiner WPF-Anwendung habe ich eine boolesche Eigenschaft, die ich dem Benutzer anzeigen möchte (z. B. mit einem schreibgeschützten Kontrollkästchen). Normalerweise würde ich INotifyPropertyChanged implementieren, damit WPF darauf reagieren und das Kontrollkästchen entsprechend ändern kann.WPF: Eigenschaftsänderung ohne Implementieren der INotifyPropertyChanged-Schnittstelle anzeigen

Das Problem, das ich gerade habe, ist, dass dieser Eigenschaftswert aus einem geschlossenen Framework abgerufen wird. Das heißt, ich kann nur den Wert abfragen, aber es gibt kein Änderungsereignis, das ich abonnieren kann.

Mein erster Gedanke war, einen separaten Thread zu erstellen, der periodisch (etwa alle 10 Millisekunden) den Wert abfragt und ein Ereignis erstellt, wenn sich der Wert geändert hat. Aber das scheint mir übertrieben zu sein.

Meine Frage ist also: Gibt es ein Feature in WPF für die Anzeige von wechselnden Werten wo INotifyPropertyChanged keine Option ist? Irgendeine Art von Abstimmungsmechanismus, vielleicht? Wenn nicht, wie würden Sie dieses Problem angehen?

Danke für Ihre Zeit.

+0

wie aus einem geschlossenen Rahmen ist glaube ich nicht, es ist möglich. ich bin nicht sicher genug, um zu schreiben, dass als Antwort. –

Antwort

4

Wenn der Wert von irgendwo kommt, kann man nicht kontrollieren, erstellen Sie ein „Ansichtsmodell“ für das betreffende Objekt und zu handhaben, dass selbst.

public class ClosedSourceObjectViewModel : ViewModelBase 
{ 
    private ClosedSourceObject ClosedSourceObject 
    { 
     get; 
     set; 
    } 

    public bool SomeProperty 
    { 
     get { return this.ClosedSourceObject.SomeProperty; } 
     set 
     { 
      if (value != this.ClosedSourceObject.SomeProperty) 
      { 
       RaisePropertyChanging("SomeProperty"); 
       this.ClosedSourceObject.SomeProperty = value; 
       RaisePropertyChanged("SomeProperty"); 
      } 
     } 
    } 
} 
+0

Wenn viele Eigenschaften vorhanden sind, können Sie auch eine vollständige Wrapper-Klasse generieren, um Zeit zu sparen. – smaclell

+3

Anmerkung 'ViewModelBase' enthält tatsächlich Implementierungen von' INotifyPropertyChanging' und 'INotifyPropertyChanged'. – user7116

+0

Danke für Ihre Beiträge! Das sind in der Tat schlechte Nachrichten. :-( Das Problem, das ich mit Ihrem Ansatz habe, ist, dass mein Wert innerhalb des geschlossenen Rahmens geändert wird, nicht von mir. Ich bin nicht in der Lage, es überhaupt zu ändern. –

0

Ich stimme @Alastair zu. Weil

(1) Sie möchten Wert aus einem geschlossenen Framework abrufen, das Sie nicht über Änderungen der Eigenschaften benachrichtigt.
(2) Sie können den Wert abfragen, aber das wollen Sie nicht!

Ich glaube nicht, es werde sein eine andere Möglichkeit, dies zu tun :(

+0

Warum schrecken Sie Polling? Die Eigenschaft ist schreibgeschützt und ändert don‘ t muss sofort reflektiert werden, eine kurze Verzögerung ist in Ordnung –

+0

@Max: Ich sehe es nicht als entmutigend für die Abstimmung. Er stimmt zu, ohne Polli ng, es ist unmöglich. Der einzige Weg, dies zu tun, ist das Polling. –

+0

OK, danke für deine Zeit. :-) Dann polling es ist ... –