【问题标题】:How to make Resharper resolve path for CustomBinding MarkupExtension如何使 Resharper 解析 CustomBinding MarkupExtension 的路径
【发布时间】:2011-07-13 00:35:41
【问题描述】:

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

但是使用 my 绑定,它在运行时正常工作,我只是在悬停“CurrentText”时得到一个工具提示,告诉我它是一些“MS.Internal.Design.Metadata.ReflectionTypeNode”,而不是通过 [Strg]+Click 导航。

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

我尝试了以下方法:

  • 从绑定派生
  • 派生自BindingDecoratorBase
  • 为我的 CustomBinding 类省略“扩展”后缀
  • 将标记扩展放在单独的程序集中
  • 使用 ConstructorArgumentAttribute
  • Path-Property 的字符串类型和 PropertyPath 类型的属性
  • 我还查看了原始类 Binding 和 BindingBase,但找不到与我的代码更多的区别。 任何想法在这里应该有什么帮助? 或者这只是对我自己的 MarkupExtensions 无法获得的 Binding-MarkupExtension 的特殊处理?

    16.03.2011 更新:也可能是 Resharper 的错误或缺陷,Jetbrains 正在调查该问题:http://youtrack.jetbrains.net/issue/RSRP-230607

    10.12.2013 更新:同时,该功能似乎正在运行(使用 R# 7.1.3,可能还有早期版本),我实际上使用了 BindingDecoratorBase 的方法,我非常喜欢它。 如果您的 MarkupExtension 以“Binding”结尾,也许它只有效,但我的有效,所以我很高兴。

    【问题讨论】:

    • 我什至不知道你能做到这一点。当我尝试它(使用常规绑定)时,我总是会得到使用 CustomBinding 时的行为。为了让它工作,我应该做些什么特别的事情?
    • 是的,Ctrl+单击 CurrentText 只会为我选择单词。您确定这不是跳到定义的扩展吗?也许是生产力电动工具?
    • 好的,我不确定,似乎是 Resharper 的一个功能。当然,它仅在您绑定到诸如 ViewModel 而不是 DataContext 之类的类型安全的东西时才有效。
    • 这是 Resharper 的一个功能,我会在问题中澄清这一点。

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,没错。我更正了我的代码示例。不幸的是,它并没有解决实际问题,在我的测试中,我在 xaml 中有命名空间,否则整个事情都无法编译。
    【解决方案2】:

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

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

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

    【讨论】:

    • +1 这将是一个非常有用的功能....希望它能在 Resharper 7.0 中使用
    • 我安装了 Resharper 7.1,但我仍然看到这个问题。此修复程序是否已实施,是否有任何文档说明如何启用它?
    • 有进一步实施计划的消息吗?
    【解决方案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}" />
    

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2017-04-09
      相关资源
      最近更新 更多