如何为CustomBinding MarkupExtension制作Resharperparsingpath
我想创build一些扩展绑定标记扩展,其行为就像一个正常的WPF绑定,但做更多的事情(使用不同的默认值,可能会添加一些行为等)。 代码如下所示:
public class CustomBindingExtension : Binding { .. some extra properties and maybe overrides ... }
这一切工作正常,包括XAML-intellisense,除了我不能使Resharper正确解决我的绑定path。 即:使用这个代码我可以[Strg] +点击'CurrentText'和Resharper让VS2010导航到定义CurrentText属性的代码。
<UserControl x:Name="uc" ...> <TextBox Text="{Binding ViewModel.CurrentText, ElementName=uc}" /> </UserControl>
但使用我的绑定,在运行时正常工作,我只是得到一个工具提示hover'CurrentText'告诉我这是一些'MS.Internal.Design.Metadata.ReflectionTypeNode',并没有通过[Strg] +点击导航。
<UserControl x:Name="uc" ...> <TextBox Text="{util:CustomBinding ViewModel.CurrentText, ElementName=uc}" /> </UserControl>
我尝试了以下的东西:
我也看了原来的类Binding和BindingBase,但是找不到我的代码有更多的区别。 任何想法应该在这里帮助吗? 或者,这只是对Binding-MarkupExtension的一种特殊处理,我无法获得自己的MarkupExtensions?
更新16.03.2011:也可能是缺陷或Resharper缺陷,Jetbrains正在调查的问题:http://youtrack.jetbrains.net/issue/RSRP-230607
更新10.12.2013:同时,该function似乎工作(与R#7.1.3,也许也是早期版本),我实际上使用BindingDecoratorBase的方法,我非常喜欢它。 如果你的MarkupExtension以'Binding'结尾,但是我的确如此,所以我很高兴。
实际上在当前版本的R#中是不可能的,不幸的是,仍然会缺less即将到来的R#6.1版本的特性。
这个function需要大量的基础设施改变,但是它在我们的列表中,并且肯定会在R#7中实现。看起来像[CustomBindingMarkup]
和[BindingPath]
(用于path
构造参数和Path
属性)属性将被引入。
我们真的很抱歉给您带来不便。
您应该使用正确的名称空间访问您的自定义标记扩展:
<UserControl x:Name="uc" ... xmlns:ext="clr-ns:YourProjectNamespace"> <TextBox Text="{ext:CustomBinding ViewModel.CurrentText, ElementName=uc}" /> </UserControl>
这里是一个关于创build自定义标记扩展的好文章。
欺骗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}" />