我想创建一些扩展的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和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',但我的确如此,所以我很高兴。
答案 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}" />