Как сделать путь решения 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}" />