// parts of this code is based upon the article : http://msdn.microsoft.com/de-de/magazine/dd419663.aspx#id0090051
class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// raises the PropertyChanged event with the given string parameter
/// </summary>
/// <param name="propertyName">name of the property, that has changed</param>
protected virtual void OnPropertyChanged(string propertyName)
{
// just to avoid wrong Event-Calls (only in debug mode)
this.VerifyPropertyName(propertyName);
// call the event handler
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
/// <summary>
/// raises the PropertyChanged-event, with the name of the property that is given by the lambda expression
/// </summary>
/// <typeparam name="Tprop">type parameter of the given property, to be ignored</typeparam>
/// <param name="property">the lambda expression f.e.: "() => TestProperty"</param>
protected virtual void OnPropertyChanged<Tprop>(Expression<Func<Tprop>> property)
{
// cast as LambdaExpression
LambdaExpression lambda_exp = (LambdaExpression)property;
if (lambda_exp != null)
{
MemberExpression member_exp = (MemberExpression)lambda_exp.Body;
if (member_exp != null)
{
OnPropertyChanged(member_exp.Member.Name);
return;
}
}
Debug.Fail("No correct LambdaExpression provided for OnPropertyChanged.");
}
[Conditional("DEBUG")]
[DebuggerStepThrough]
public void VerifyPropertyName(string propertyName)
{
// Verify that the property name matches a real,
// public, instance property on this object.
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
{
string msg = "Invalid property name: " + propertyName;
Debug.Fail(msg);
}
}
}
Posts mit dem Label mvvm werden angezeigt. Alle Posts anzeigen
Posts mit dem Label mvvm werden angezeigt. Alle Posts anzeigen
Donnerstag, 18. Juli 2013
Code Snippet: ViewModelBase
Oft benötige ich eine Implementierung der ViewModelBase-Klasse, dann muss ich diese entweder aus anderen Projekten kopieren, oder googeln. Jetzt muss ich das nicht mehr, denn ich merk sie mir einfach hier:
Freitag, 28. September 2012
Code Snippet: Thread sicherer Zugriff auf WPF-Control
Motivation
Verwendet man in WPF konsequent das MVVM-Modell, so greift man immer auf das ViewModel zu, anstatt direkt mit irgendwelchen GUI-Elementen zu interagieren. Da der Zugriff auf das ViewModel wiederum threadunabhängig ist, kommt man eigentlich nie (oder eher selten) in die Lage folgenden Code einzusetzen. Aber wie immer bestätigen Ausnahmen die Regel - mir fällt zwar spontan kein einfacher Anwendungsfall ein, aber in der täglichen Praxis habe ich diesen Code schon einige male verwendet:// nehmen wir an, wir haben eine TextBox und wollen threadsicher den Text verändern
class ThreadSafeTextBox : TextBox
{
public void SetTextThreadSafe(string text)
{
// prüft, ob der aktuelle Thread dem Dispatcher
// dieses Controls zugeordnet ist
if (this.Dispatcher.CheckAccess())
{
// Ist dies der Fall, können wir den Text einfach setzen.
// Man sollte beachten, dass man sich jetzt in dem
// Dispatcher Thread befindet, man sollte hier also nur
// "schnell" auf die GUI zugreifen. Alles was lange dauert
// und nichts direkt mit der GUI zu un hat, gehört hier nicht rein!
base.Text = text;
}
else
{
// anderenfalls müssen wir den Dispatcher "invoken"
this.Dispatcher.Invoke(new Action(
() =>
{
// jetzt können wir sicher auf den Text zugreifen
SetTextThreadSafe(text);
})
);
}
}
}
}
Abonnieren
Posts (Atom)