2012-05-02 10 views
3

こんにちは経由のviewmodelのインターフェイスの実装への結合の間に男と、そのような長い質問には申し訳ありませんが、...BindingError F#

は、私はこの1つのようなC#のインターフェースがあります。そして、私が持っている

public interface ISimpleViewModel 
{ 
    string SimpleText { get; } 
} 

をそれから継承されたF#型:

type SimpleViewModel() = 
    interface ISimpleViewModel with 
     member this.SimpleText 
      with get() = "Hello again!" 

また、私はC#の相続を持っている:

public class SimpleCSViewModel : ISimpleViewModel 
{ 
    public string SimpleText 
    { 
     get { return "Just testing"; } 
    } 
} 

結局私は、メイン・ウィンドウのctorがISimpleViewModelインスタンスと、このように注入され、超簡単なWPFアプリケーションがあります。

public partial class MainWindow : Window 
{ 
    public MainWindow(ISimpleViewModel viewModel) 
    { 
     ViewModel = viewModel; 
     InitializeComponent(); 
    } 

    public ISimpleViewModel ViewModel 
    { 
     get { return DataContext as ISimpleViewModel; } 
     set { DataContext = value; } 
    } 
} 

をそしてもちろん、私は、テキストプロパティがSimpleTextのにバインドされ、私のウィンドウ上のTextBlockを持っています。

私はC#インスタンスを注入している場合に、すべての動作が有効です。しかし、BindingErrorは、F#インスタンスの場合にプロパティを見つけることができます。それはなぜそうかもしれませんか?

答えて

3

WPFバインディングがどのように機能するかは十分に分かりませんが、F#のインターフェイスは明示的にが実装されています(実装方法は実際に非公開です)。デフォルトではC#で暗黙的に扱われています。代わりにC#で明示的なインターフェイス実装を使用するとどうなりますか?これが本当に問題の場合は、F#型のパブリックプロパティを作成してインターフェイス実装の動作を複製するだけです。

+0

私の場合は、ViewModels.SimpleViewModel(ViewModelsはF#のモジュール名)を注入し、MainWindow部分クラス全体に適用すると問題なく動作します。また、SameNameを持つパブリックプロパティを作成するソリューションでも、同じ動作がうまく機能しています:) – PompolutZ