Как сделать 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>
Я пробовал следующие вещи:
Я также посмотрел на исходные классы 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 ответа:
на самом деле это невозможно в текущих версиях 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}" />