
Microsoft DevLabs hat ein Framework veröffentlicht, mit dem asynchrone und event-basierte Vorgänge reaktiv mittels LINQ gehandhabt werden können. Dieses Framework nennt sich Reactive Extensions (Rx), ist auch unter der Bezeichnung 'LINQ to Events' bekannt und kann kostenlos heruntergeladen werden. Mit ihm steht ein mächtiges Werkzeug bereit, das gerade bei asynchronen und eventbasierten Vorgängen seine Stärke ausspielen kann. Der Webcast bietet eine Einführung in die reaktive Programmierung mittels Rx.

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487439
Übungen zum Webcast
Zu diesem Webcast habe ich ein paar Übungen vorbereitet. Somit stehen für Silverlight und WPF folgende Aufgaben zum Lösen bereit:
Rx unter Silverlight
Das Doppelklick-Feature kommt erst mit Silverlight 5. Bei der ersten Aufgabe geht es darum, eine einfache Doppelklick-Logik selbst zu implementieren:
1: namespace SilverlightDoubleClick
2: {
3: public partial class MainPage : UserControl
4: {
5: private readonly DispatcherTimer _doubleClickTimer;
6:
7: public MainPage()
8: {
9: InitializeComponent();
10:
11: _doubleClickTimer = new DispatcherTimer();
12: }
13:
14: private void BnClickMe_Click(object sender, RoutedEventArgs e)
15: {
16: if(_doubleClickTimer.IsEnabled)
17: {
18: // TODO: Erst bei einem Doppelklick, darf dieser Code ausgeführt werden.
19: // Hinweis! Verwende den _doubleClickTimer als Hilfe.
20: MessageBox.Show("Doppelklick ausgeführt!");
21: }
22: }
23: }
24: }
Bei der zweiten Aufgabe muss die Doppelklick-Logik mittels Rx gehandhabt werden:
1: namespace SilverlightRxDoubleClick
2: {
3: public partial class MainPage : UserControl
4: {
5: public MainPage()
6: {
7: InitializeComponent();
8:
9: // Hinweis! Verwende FromEventPattern und Buffer.
10: Observable.Never<object>();
11: }
12:
13: public void ButtonClick()
14: {
15: // TODO: Erst bei einem Doppelklick, darf dieser Code ausgeführt werden.
16: MessageBox.Show("Doppelklick ausgeführt!");
17: }
18: }
19: }
Rx unter WPF
Diese Übungsaufgabe ist schon etwas für Fortgeschrittene Entwickler. Hier soll erst auf eine Gültige PLZ Eingabe überprüft werden und dann soll die Abfrage zum Ort stattfinden. Das ganze Szenario auch noch vom ViewModel aus.

1: namespace WpfRxViewModel.ViewModel
2: {
3: public class DefaultViewModel : INotifyPropertyChanged
4: {
5: private string _textInput;
6: public string TextInput
7: {
8: get { return _textInput; }
9: set
10: {
11: _textInput = value;
12:
13: OnPropertyChanged("TextInput");
14: }
15: }
16:
17: private string _city;
18: public string City
19: {
20: get { return _city; }
21: set
22: {
23: _city = value;
24:
25: OnPropertyChanged("City");
26: }
27: }
28:
29: public event PropertyChangedEventHandler PropertyChanged;
30:
31: public DefaultViewModel()
32: {
33: // TODO: Bei der Eingabe vom Text soll überprüft werden ob es sich hierbei um eine gültige PLZ handelt.
34: // Wenn Ja, soll erst dann automatisch der Stadtname abgefragt und dem Property City überreicht werden.
35: // Hinweis: Bei der Eingabe der TextBox für die PLZ, wird jeweils das PropertyChanged Event gefeuert.
36: // GetCityName kann in der Linq abfrage eingebunden werden.
37: Observable.Never<string>();
38: }
39:
40: public Func<string, string> GetCityName = zip =>
41: {
42: var zipRepository = new ZipRepository();
43: return zipRepository.GetCityFromZip(zip);
44: };
45:
46: public void OnPropertyChanged(string propertyname)
47: {
48: PropertyChangedEventHandler handler = PropertyChanged;
49: if (handler != null) handler(this, new PropertyChangedEventArgs(propertyname));
50: }
51: }
52: }
Ich bin auf jeden Fall schon auf Eure Lösungen gespannt, die Ihr mir gerne per E-Mail zukommen lassen könnt. Die besten Lösungen werden mit einem eigenen Blog-Post dann veröffentlicht.
Viel Spaß!
Euer Gregor
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
