61

拡張されたBinding-Markup-Extensionを作成したいのですが、これは通常のWPF-Bindingと同じように動作しますが、さらにいくつかのことを行います(異なるデフォルトを使用する、動作を追加するなど)。コードは次のようになります。

public class CustomBindingExtension : Binding
{
  .. some extra properties and maybe overrides ...
}

ResharperにBinding-Pathを正しく解決させることができないことを除いて、XAMLインテリセンスを含めてすべて正常に機能します。つまり、このコードを使用して[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>

私は次のことを試しました:

  • バインディングから派生
  • BindingDecoratorBaseから派生
  • CustomBindingクラスの「Extension」サフィックスを省略します
  • Markup-Extensionを別のアセンブリに配置します
  • ConstructorArgumentAttributeを使用する
  • Path-Propertyのタイプstringおよびタイプ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に実装されます。and (コンストラクターパラメーターとプロパティの[CustomBindingMarkup]場合)属性が導入されるようです。[BindingPath]pathPath

    ご不便をおかけして申し訳ございません。

    于 2011-10-25T10:44:57.160 に答える
    1

    正しい名前空間を使用して、カスタムMarkup-Extensionにアクセスする必要があります。

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

    これは、カスタムMarkup -Extensionsの作成に関する優れた記事です。

    于 2011-10-23T12:40:19.740 に答える
    1

    R#をだます1つの方法は、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 に答える