MVVM
- INotifyPropertyChanged
- ObservableCollection
- IValueConverter
- Example converting bool in view model to the UI Visibility enumberation.

- Navigation with Frame and UriMapper
- MVVM for increased testability and separation.1, 2, 3
- Use MEF for plugin / extensibility support (drag dll in and have new forms appear). PRISM builds on top of this further by providing composite application guidance for large applications. Currently requires some manual code for these two to work together although PRISM in the future will likely make use of MEF instead of doing that part itself.
- Event Aggregation
INotifyPropertyChange vs DependencyProperty
Typically, you'll use DPs when working with UI elements (ie: making a control), and INotifyPropertyChanged whenever working with classes that are part of your application logic.
The reason for this is mainly to separate the View code from the application logic. While you can use DPs in application code, doing so has some disadvantages - it ties your application code to the UI platform in question (ie: WPF). INotifyPropertyChanged doesn't take WPF as a dependency, so you can write your application/business logic/model code without taking a WPF dependency.
In addition, DPs are much more difficult to "get right" - this is especially true when writing business logic, as you typically want custom code in your property setter. That being said, if you're using data binding, the setter is never called in a DP, so you need to use the property changed metadata callbacks, which makes your code far more complicated.
http://social.msdn.microsoft.com/Forums/ar-SA/wpf/thread/a4a5a46f-ec4d-433e-b861-706d13bf9de5
Controls
Layout
- Grid
- Canvas
- StackPanel
- Resources 1, 2
Data Lists
User Controls
- Consider using Weak Event Manager to reduce memory leaks (Resource 1, 2)
Useful Links
Debugging WCF Errors
Add to web.config:
<serviceDebug includeExceptionDetailInFaults="True"/>
View WCF communication using Fiddler HTTP Debugger.
Creating and Handling Faults in Silverlight
Snippets
<TextBox Text="{Binding ReleaseDate, StringFormat='MMM dd, yyyy',
Mode=TwoWay}" />
<TextBlock Text="{Binding Price, StringFormat='c'}" />
<TextBlock Text="{Binding Developer, TargetNullValue='(None)'}" />
<TextBlock Text="{Binding Publisher, FallbackValue='(Nope)'}" />
<StackPanel.RenderTransform>
<CompositeTransform
ScaleX="{Binding Value,ElementName=stretcher}"
ScaleY="{Binding Value,ElementName=stretcher}" />
</StackPanel.RenderTransform>