Developing a Robust Data Driven UI Using WPF - An Overdue Summary (and full source code)
I wrote the stocky application more than a year ago as a research project aimed at proving that using WPF we can separate presentation metadata (XAML) from program logic. The goal was to provide the Duet team at SAP with a document reference sample for using M-V-VM to achieve this separation.
I started documenting the proof-of-concept in a series of posts but unfortunately after leaving SAP my interests (and work) shifted away from WPF and I didn’t find the time to finish the series.
I’ve received numerous requests to release the source code but I couldn’t do so because it was part of a larger infrastructure code I wrote at SAP which basically ads a lot of noise to the sample (an d probably ads legal issues for me sharing it).
Anyway, I took some time off this afternoon to re-write the sample independently so that I could share it:
This, I guess is the long overdue ending for the series:
- Introduction - introduces the concept of M-V-VM and the reasoning behind it.
- The DataModel - describes how to write the Model part of our application.
- Stock DataModel Sample - provides a conrete implementation of a Stock model and its view..
However, If you’re interested in M-V-VM in WPF, there are numerous topics worth mentioning that I didn’t get to cover and are definitely worth checking out:
Unit Testing
As I said in the introduction post, one of the most important benefits of seperating the logic code from the presentation (XAML) is that its straightforward to unit test. In fact, my next post following the Stock DataModel Sample was going to be about unit testing - specifically, how to test the DataModel its provider which, because of the use of threading, is a bit tricky.
This post is actually 99% done in the comments of the unit test code that’s in DefaultStockQuoteProviderTest.cs in the provided source code. So do yourself a favor and go over the code. It’s not long and very well documented…
Using Lambda Expression for DataBinding
Data-binding is pretty much at the heart of the M-V-VM concept and it makes us write Value Converters which is pretty tedious and annoying.
Wouldn’t it be great if we could replace writing lots of IValueConverter classes like this:
<TextBlock Foreground="{Binding Change, Converter={StaticResource StockForegroundConverter}}" … />
[ValueConversion(typeof(double), typeof(Brush))]
public class StockChangeToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double change = (double)value;
if (change == 0) return Brushes.Black;
return (change < 0) ? Brushes.DarkRed : Brushes.Green;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return double.NaN;
}
}
To just the following XAML statement that embeds the conversion logic:
<TextBlock Foreground="{Binding Change, Converter={ change=> if (change == 0) return Brushes.Black; return (change < 0) ? Brushes.DarkRed : Brushes.Green; }}" … />
M. Orçun Topdağı wrote an excellent series on using Lambda Expressions for data-binding in WPF to achieve just that:
- WPFix Part 1 (Lambda Converter Extension)
- WPFix Part 2 (Binding Extension)
- WPFix Part 3 (Extension Methods)
Reference Applications and Guidance
I haven’t seen a lot of sample WPF LOB reference applications out there but here are some interesting links for further learning:
- Prism: patterns & practices Composite Application Guidance for WPF and Silverlight site
- M-V-VM Reference Application - A new project that aims to “created reference application for M-V-VM frameworks to use for demonstration purposes, similar in concept to Pet Shop for web frameworks.”