如何使Resharper解析CustomBinding MarkupExtension的路径

时间:2011-03-10 20:07:16

标签: wpf visual-studio-2010 xaml resharper markup-extensions

我想创建一些扩展的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-Property的代码。

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

但是使用我的绑定,它在运行时正常工作,我只是在悬停'CurrentText'时得到一个工具提示,告诉我它是'MS.Internal.Design.Metadata.ReflectionTypeNode',并且没有通过[Strg] +点击导航。

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

我尝试了以下事项:

  • 从Binding派生
  • BindingDecoratorBase
  • 派生
  • 省略CustomBinding-class
  • 的'Extension'后缀
  • 将Markup-Extension放在单独的程序集中
  • 使用ConstructorArgumentAttribute
  • 类型字符串的属性和路径属性的类型PropertyPath
  • 我还查看了原始类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 个答案:

    答案 0 :(得分:4)

    实际上在当前版本的R#中是不可能的,不幸的是,它仍然缺少即将发布的R#6.1版本的功能。

    此功能需要很多的基础架构更改,但它在我们的列表中,肯定会在R#7中实现。看起来像[CustomBindingMarkup][BindingPath](对于{将引入{1}}构造函数参数和path属性)属性。

    对于给您带来的任何不便,我们深表歉意。

    答案 1 :(得分:1)

    您应该使用正确的命名空间访问自定义标记扩展:

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

    Here是一篇关于创建自定义标记扩展的好文章。

    答案 2 :(得分:1)

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