Neue Ideen für MVVM Pattern
Erno de Weerd, hat einen neuen Ansatz des MVVM Patterns in seinem Blog infoSupport beschrieben. Hier wird mit Hilfe von Reflections eine Implementierung geschaffen die flexibler und robuster auf Veränderungen des Views und des Models reagiert und somit für den Entwickler Zeit spart.
using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
using System.Windows;
namespace MVVM
{
public class ViewModelBase<T> : INotifyPropertyChanged
{
public App Application
{
get
{
return App.Current as App;
}
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged<TProperty>(
Expression<Func<T, TProperty>> propertyExpression)
{
MemberExpression memberExpression = propertyExpression.Body
as System.Linq.Expressions.MemberExpression;
if (memberExpression == null || (memberExpression != null &&
memberExpression.Member.MemberType != MemberTypes.Property))
{
throw new ArgumentException(
„The specified expression does not represent a valid property“);
}
OnPropertyChanged(memberExpression.Member.Name);
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler p = PropertyChanged;
if (p != null)
{
p(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
}
Abb.: Base Class für das ViewModel
Sprachen unabhängig zu sein hat bei der App Entwicklung einen Marktentscheidenen Vorteil und ist rechtzeitig mit einzuplanen bei der Entwicklung.
using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
using System.Windows;
namespace MVVM
{
public class ViewModelBase<T> : INotifyPropertyChanged
{
private static Example.Resources.Cultures.AppResources _uiTexts = new Resources.Cultures.AppResources();
public Example.Resources.Cultures.AppResources UITexts
{
get
{
return _uiTexts;
}
}
public void ChangeLanguage(string language)
{
Example.Resources.Cultures.AppResources.Culture = new System.Globalization.CultureInfo(language);
OnPropertyChanged(„UITexts“);
}
public App Application
{
get
{
return App.Current as App;
}
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged<TProperty>(
Expression<Func<T, TProperty>> propertyExpression)
{
MemberExpression memberExpression = propertyExpression.Body
as System.Linq.Expressions.MemberExpression;
if (memberExpression == null || (memberExpression != null &&
memberExpression.Member.MemberType != MemberTypes.Property))
{
throw new ArgumentException(
„The specified expression does not represent a valid property“);
}
OnPropertyChanged(memberExpression.Member.Name);
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler p = PropertyChanged;
if (p != null)
{
p(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
}
Abb.: Ressourcen Handles
Und so einfach ist der Einsatz im XAML:
<TextBlock x:Name=“PageTitle“
Text=“{Binding UITexts.LocationsHeader}“ />
Quelle:
Windows Phone 7 MVVM ViewModel ideas