Как сделать путь решения Resharper для CustomBinding MarkupExtension

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

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

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

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

Но используя привязку my, которая работает корректно во время выполнения, я просто получаю подсказку при зависании "CurrentText", сообщая мне, что это "MS.Internal.Design.Metadata.ReflectionTypeNode", и нет навигации по [Strg] + Click.

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

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

Вывести из привязки Вывести BindingDecoratorBase Оставьте суффикс 'Extension' для моего класса CustomBinding добавьте расширение разметки в отдельную сборку Использовать конструкторArgumentAttribute Свойство типа string и type PropertyPath для Path-Property

Я также посмотрел на исходные классы Binding и BindingBase, но не смог найти больше отличий от моего кода. Любые идеи, что здесь должно помочь? Или это просто особый подход к Binding-MarkupExtension, который я никоим образом не могу получить для своих собственных MarkupExtensions?

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

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

Ответ 1

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

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

Мы действительно извиняемся за любые неудобства.

Ответ 2

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

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

Здесь - хорошая статья о создании собственных расширений-расширений.

Ответ 3

Один из способов обмануть R # - назвать его Binding:

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}" />