2009-07-08 9 views
2

Ich lese Daten von einem seriellen Port mit einem Event-Listener aus der SerialPort-Klasse. In meinem Event-Handler muss ich viele (30-40) Steuerelemente in meinem Fenster mit XML-Daten aktualisieren, die über den seriellen Port kommen.wpf: mehrere Steuerelemente über Dispatcher aktualisieren

Ich weiß, dass ich myControl.Dispatcher.Invoke() verwenden muss, um es zu aktualisieren, da es in einem anderen Thread ist, aber gibt es eine Möglichkeit, viele Steuerelemente zusammen zu aktualisieren, anstatt einen separaten Aufruf für jedes aufzurufen (dh myCon1.Dispatcher.Invoke(), myCon2.Dispatcher.Invoke() usw.)?

Ich bin auf der Suche nach etwas wie aufrufen auf dem Container aufrufen, und jedes Kind Steuerelement einzeln aktualisieren, aber ich kann nicht scheinen, wie dies zu erreichen.

Danke!

Antwort

1

Was Sie tun müssen, ist MVVM verwenden.

Sie binden Ihre Steuerelemente an öffentliche Eigenschaften in einem ViewModel. Ihre VM kann den seriellen Port abhören, die XML-Daten analysieren, ihre öffentlichen Eigenschaften aktualisieren und dann INotifyPropertyChanged verwenden, um der Benutzeroberfläche mitzuteilen, dass sie ihre Bindungen aktualisieren soll.

Ich würde diese Route vorschlagen, da Sie Benachrichtigungen im Stapel verarbeiten und den Dispatcher verwenden können, um das Ereignis im UI-Thread aufzurufen.

UI:

<Window ...> 
    <Window.DataContext> 
    <me:SerialWindowViewModel /> 
    </Window.DataContext> 
    <Grid> 
    <TextBlock Text="{Binding LatestXml}/> 
    </Grid> 
</Window> 

SerialWindowViewModel:

public class SerialWindowViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string LatestXml {get;set;} 

    private SerialWatcher _serialWatcher; 

    public SerialWindowViewModel() 
    { 
    _serialWatcher = new SerialWatcher(); 
    _serialWatcher.Incoming += IncomingData; 
    } 

    private void IncomingData(object sender, DataEventArgs args) 
    { 
    LatestXml = args.Data; 
    OnPropertyChanged(new PropertyChangedEventArgs("LatestXml")); 
    } 

    OnPropertyChanged(PropertyChangedEventArgs args) 
    { 
    // tired of writing code; make this threadsafe and 
    // ensure it fires on the UI thread or that it doesn't matter 
    PropertyChanged(this, args); 
    } 
} 

Und wenn das nicht für Sie akzeptabel ist (und Sie wollen WPF programmieren, wie es ist eine WinForms-Anwendung) können Sie Dispatcher verwenden. CurrentDispatcher wird einmal aufgerufen, während Sie alle Steuerelemente in Ihrem Formular manuell aktualisieren. Aber diese Methode stinkt.

+0

Danke! Das sieht nach etwas aus, das ich implementieren kann! – Klay

Verwandte Themen