Как заставить Resharper разрешить путь для CustomBinding MarkupExtension - PullRequest
60 голосов
/ 10 марта 2011

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

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

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

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

Но, используя my привязку, которая работает правильно во время выполнения, я просто получаю всплывающую подсказку при наведении курсора CurrentText, говорящую мне, что это какой-то MS.Internal.Design.Metadata.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, но не смог найти больше различий с моим кодом. Есть идеи, что должно помочь здесь? Или это просто специальная обработка 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», а у меня - так, я счастлив.

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

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

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

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

1 голос
/ 19 декабря 2014

Один из способов обмануть 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}" />
1 голос
/ 23 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...