¿Existe un XAML equivalente a nameof?

¿Existe un XAML equivalente a nameof?

Puede crear una extensión de marcado personalizada.

Por ejemplo:

[ContentProperty(nameof(Member))]
public class NameOfExtension : MarkupExtension
{
    public Type Type { get; set; }
    public string Member { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (serviceProvider == null)
            throw new ArgumentNullException(nameof(serviceProvider));

        if (Type == null || string.IsNullOrEmpty(Member) || Member.Contains("."))
            throw new ArgumentException("Syntax for x:NameOf is Type={x:Type [className]} Member=[propertyName]");

        var pinfo = Type.GetRuntimeProperties().FirstOrDefault(pi => pi.Name == Member);
        var finfo = Type.GetRuntimeFields().FirstOrDefault(fi => fi.Name == Member);
        if (pinfo == null && finfo == null)
            throw new ArgumentException($"No property or field found for {Member} in {Type}");

        return Member;
    }
}

Uso de muestra:


Por alguna razón, mi diseñador no funciona bien con la solución de G.Sharada, aunque funciona muy bien en tiempo de ejecución.

Fui por una ruta ligeramente diferente:

public class NameOfExtension : MarkupExtension
{
    private readonly PropertyPath _propertyPath;

    public NameOfExtension(Binding binding)
    {
        _propertyPath = binding.Path;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var indexOfLastVariableName = _propertyPath.Path.LastIndexOf('.');
        return _propertyPath.Path.Substring(indexOfLastVariableName + 1);
    }
}

De esta manera puedo hacer:

<TextBlock Text="{local:NameOf {Binding Property1.Property2}}" />

Obviamente, esto no es un reemplazo, ya que es posible que no tengamos un objeto instanciado al que vincularnos. Supongo que podría tener 2 constructores, uno que tome un enlace y el otro una cadena de miembros.