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);
}
}
Kann wie folgt im xaml verwendet werden
<xaml>
<personenanzeigecontrol person = " { my:Person nachname=Müller } " />
</xaml>
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}“