3

みなさん、こんにちは。長い質問をしてすみませんが...

私はこのような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"; }
    }
}

最終的に、MainWindowctorに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; }
    }
}

そしてもちろん、TextプロパティがSimpleTextにバインドされているTextBlockがウィンドウにあります。

C#インスタンスを注入する場合に備えて、すべてが機能します。しかし、F#インスタンスの場合にプロパティが見つかる可能性があるBindingErrorを受け取ります。なぜそうなるのでしょうか?

4

1 に答える 1

3

WPFバインディングがどのように機能するかについては十分にわかりませんが、覚えておくべきことの1つは、F#のインターフェイスが明示的に実装されていることです(つまり、実装メソッドは実際には非公開です)が、デフォルトでは暗黙的ですC#で。代わりにC#で明示的なインターフェイス実装を使用するとどうなりますか?これが実際に問題である場合、最も簡単な修正は、インターフェイス実装の動作を複製するパブリックプロパティをF#タイプに作成することです。

于 2012-05-02T15:27:58.367 に答える