61

我想创建一些扩展的 Binding-Markup-Extension,它的行为就像普通的 WPF 绑定,但做的更多(使用不同的默认值,可能添加一些行为等)。代码如下所示:

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]+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”结尾,也许它只有效,但我的有效,所以我很高兴。

    4

    3 回答 3

    4

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

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

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

    于 2011-10-25T10:44:57.160 回答
    1

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

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

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

    于 2011-10-23T12:40:19.740 回答
    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}" />
    
    于 2014-12-18T22:57:58.883 回答