code it

Martins Tech Blog

INotifyPropertyChanged ohne Magic Strings mit Prism 4

Wer mit WPF zu tun hat, kennt das: Damit die Benutzeroberfläche richtig aktualisiert wird, müssen die ViewModels INotifyPropertyChanged implementieren und das große Problem dabei ist, dass die PropertyChangedEventArgs den Namen der Eigenschaft als String erwarten. Wenn man sich konzentriert, ist das initial auch nicht allzu schwierig. Problematisch kann es dann werden, wenn man Refactorings durchführt und dann vergisst, den String anzupassen.

using System.ComponentModel;

public class MainViewModel : INotifyPropertyChanged
{
    private string zahl1;

    public event PropertyChangedEventHandler PropertyChanged;

    public string Zahl1
    {
        get
        {
            return this.zahl1;
        }

        set
        {
            this.zahl1 = value;
            this.RaisePropertyChanged("Zahl1");
        }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Dieses Problem kann man sehr elegant mit AOP umgehen - zum Beispiel mit einem Aspekt mit PostSharp. Diese Lösung finde ich persönlich sehr elegant, jedoch kann oder möchte man dieses Produkt nicht immer einsetzen. Deshalb möchte ich hier kurz auf eine andere Alternative hinweisen. Mehr...

MultiBindings im Tooltip

Um in WPF mehrere Werte der Datenquelle in einem Ziel zusammenzufassen, gibt es MultiBindings. Hier kann man auf ähnliche Weise wie in string.Format definieren, wie die Daten angezeigt werden sollen.

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="Name: {0}, {1}" >
            <Binding Path="LastName"></Binding>
            <Binding Path="FirstName"></Binding>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Das gleiche kann man auch im Tooltip erreichen. Dafür gibt es einen kleinen Trick: Weil der Tooltip ein ContentControl ist können dort nicht nur Texte angezeigt werden, sondern auch Controls hinzugefügt werden. Für den Anwendungsfall bedeutet das, dass einfach in den Tooltip ein mit Multibinding versehener Textblock eingefügt wird.

<Image Width="180" Source="file:///C:/Temp/avatar.jpg">
    <Image.ToolTip>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="Name: {0}, {1}" >
                    <Binding Path="LastName"></Binding>
                    <Binding Path="FirstName"></Binding>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Image.ToolTip>
</Image>