wpf visual-studio-2010 xaml resharper markup-extensions

wpf - Cómo hacer que Resharper resuelva la ruta para CustomBinding MarkupExtension



visual-studio-2010 xaml (3)

Debería acceder a su extensión de marcado personalizada, utilizando el espacio de nombre correcto:

<UserControl x:Name="uc" ... xmlns:ext="clr-ns:YourProjectNamespace"> <TextBox Text="{ext:CustomBinding ViewModel.CurrentText, ElementName=uc}" /> </UserControl>

Here hay un buen artículo sobre cómo crear extensiones de marcado personalizadas.

Quiero crear un Binding-Markup-Extension ampliado, que se comporta como un WPF-Binding normal, pero hace algunas cosas más (usar diferentes valores predeterminados, tal vez agregar algún comportamiento, etc.). El código se ve así:

public class CustomBindingExtension : Binding { .. some extra properties and maybe overrides ... }

Todo funciona bien incluyendo XAML-intellisense, excepto que no puedo hacer que Resharper resuelva mi Binding-Path correctamente. Es decir: usando este código puedo [Strg] + hacer clic en ''CurrentText'' y Resharper permite que vs2010 navegue hasta el código que define CurrentText-Property.

<UserControl x:Name="uc" ...> <TextBox Text="{Binding ViewModel.CurrentText, ElementName=uc}" /> </UserControl>

Pero al usar mi enlace, que funciona correctamente en tiempo de ejecución, obtengo una Información sobre herramientas cuando cierro ''Texto actual'' diciéndome que es un ''MS.Internal.Design.Metadata.ReflectionTypeNode'', y no hay navegación a través de [Strg] + Click.

<UserControl x:Name="uc" ...> <TextBox Text="{util:CustomBinding ViewModel.CurrentText, ElementName=uc}" /> </UserControl>

Intenté las siguientes cosas:

  • Derivar del enlace
  • Derivar de BindingDecoratorBase
  • Deje fuera el sufijo de ''Extensión'' para mi CustomBinding-class
  • pon la Markup-Extension en un ensamble separado
  • Usar ConstructorArgumentAttribute
  • Propiedad del tipo string y tipo PropertyPath para Path-Property
  • También miré las clases originales Binding y BindingBase, pero no pude encontrar más diferencia en mi código. ¿Alguna idea de lo que debería ayudar aquí? ¿O es solo un tratamiento especial de la Binding-MarkupExtension que de ninguna manera puedo obtener para mis propias MarkupExtensions?

    Actualización 16.03.2011: También podría ser error o deficiencia de Resharper, Jetbrains está investigando el problema: http://youtrack.jetbrains.net/issue/RSRP-230607

    Actualización 10.12.2013: Mientras tanto, la función parece estar funcionando (con R # 7.1.3, tal vez también versiones anteriores), realmente uso el enfoque con BindingDecoratorBase y me gusta mucho. Tal vez solo funcione, si tu MarkupExtension termina en ''Encuadernación'', pero la mía lo hace, así que estoy feliz.


    En realidad, no es posible en las versiones actuales de R # y, desafortunadamente, todavía falta la función de la próxima versión de R # 6.1.

    Esta característica requiere muchos cambios de infraestructura, pero está en nuestra lista y definitivamente se implementará en R # 7. Parece que se introducirán los atributos [CustomBindingMarkup] y [BindingPath] (para el parámetro del constructor de path y la propiedad Path ).

    Realmente nos disculpamos por cualquier inconveniente.


    Una forma de engañar a R # es nombrarla Enlace:

    public class Binding : MarkupExtension { public Binding() { } public Binding(string path) { Path = path; } public string Path { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { return 5; } }

    Entonces funciona igual que el enlace estándar con R #

    <TextBlock Text="{custom:Binding SomeProp}" />