Как сделать Resharper resolve path для CustomBinding MarkupExtension


Я хочу создать некоторое расширенное расширение Binding-Markup-Extension, которое ведет себя так же, как обычное WPF-Binding, но делает некоторые вещи больше (используйте разные значения по умолчанию, возможно, добавьте некоторое поведение и т. д.). Код выглядит так:

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

все это отлично работает, включая XAML-intellisense, за исключением того, что я просто не могу заставить Resharper правильно решить мой путь привязки. Т. е.: используя этот код я могу [Strg]+нажать на 'CurrentText' и Resharper позволяет vs2010 перейти к коду, определяющему CurrentText-Собственность.

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

, но через мой привязка, которая работает правильно во время выполнения, я просто получаю подсказку при наведении "CurrentText", сообщая мне, что это какой-то " MS.Internal.Дизайн.Метаданные.ReflectionTypeNode', и нет навигации через [Strg] + нажмите.

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

Я пробовал следующие вещи:

  • производные от привязки
  • выводим из BindingDecoratorBase
  • оставьте суффикс 'Extension' для мой CustomBinding-класс
  • поместите расширение разметки в отдельную сборку
  • Используйте ConstructorArgumentAttribute
  • свойство типа string и тип PropertyPath для Path-Property
  • Я также посмотрел на исходные классы Binding и BindingBase, но не смог найти больше разницы в моем коде. Любые идеи, что должно помочь? Или это просто специальная обработка привязки-MarkupExtension, которую я никак не могу получить для себя Наценки?

    обновление 16.03.2011: также может быть ошибка или недостаток Resharper, Jetbrains исследует проблему:http://youtrack.jetbrains.net/issue/RSRP-230607

    обновление 10.12.2013: между тем, функция, кажется, работает (с R# 7.1.3, возможно, и более ранние версии), я на самом деле использую подход с BindingDecoratorBase и мне это очень нравится. Может быть, это работает только, если ваша MarkupExtension заканчивается на "привязке", но мой делает, так что я счастливый.

    3 60

    3 ответа:

    на самом деле это невозможно в текущих версиях R# и, к сожалению, все еще отсутствует функция предстоящего выпуска R# 6.1.

    эта функция требует большое инфраструктурных изменений, но это в нашем списке и, безусловно, будет реализовано в R# 7. Похоже [CustomBindingMarkup] и [BindingPath] (для path параметр конструктора и Path свойства) будут введены.

    мы приносим свои извинения за любые неудобства.

    вы должны получить доступ к своему пользовательскому расширению разметки, используя правильное пространство имен:

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

    здесь это хорошая статья о создании пользовательских разметки-расширений.

    один из способов обмануть R# - это назвать его привязкой:

    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;
        }
    }
    

    тогда он работает так же, как стандартная привязка с R#

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