Markup-Extension in WPF selber erstellen

Lange nichts geschrieben.. Heute eine Kleinigkeit zu wpf:

Markup-Extension in WPF selber erstellen:

Bsp: Ein PersonenAnzeigeControl erwartet ein Objekt vom Typ Person – auch in xaml – hier können aber nur Texte übergeben werden. (Nachname sei eindeutig….) :

Eine Klasse:

public class PersonExtension : MarkupExtension
{
public string Nachname { get; set;}
public override object ProvideValue(IServiceProvider serviceProvider)
{
//Target herausfinden…
IProvideValueTarget provideValueTarget = (IProvideValueTarget) serviceProvider.GetService(typeof (IProvideValueTarget));
DependencyProperty dependencyProperty = provideValueTarget.TargetProperty as DependencyProperty;
if (dependencyProperty == null)
{
return null;
}
//dependencyProperty ist nun das Target, dass gesetzt werden soll (hier „Person“) –
//wichtig, damit Personen nur den Richtigen Properties zugewiesen werden
return dependencyProperty.PropertyType!=typeof(Person) ? null : Person.FindByNachname(this.Nachname);
}
}
view raw PersonExtension.cs hosted with ❤ by GitHub

Kann wie folgt im xaml verwendet werden

<xaml>
<personenanzeigecontrol person = " { my:Person nachname=Müller } " />
</xaml>
view raw PersonExtension.xaml hosted with ❤ by GitHub

Hinweise:

  • Die Klasse PersonExtension kann in xaml als my: PersonExtension oder als my:Person verwendet werden. Funktioniert nur, wenn es keine richtige Klasse my:Person gibt.
  • Wenn es einen Konstruktor gäbe
    • public PersonExtension(string nachname)…
    • Könnte die Extension in xaml (auch) wie folgt verwendet werden: Person=“{my:Person Müller}“