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"; }
    }
}

最终我有一个超级简单的 WPF 应用程序,其中 MainWindow ctor 以这种方式注入 ISimpleViewModel 实例:

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

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

当然,我的窗口上有一个 TextBlock,它的 Text 属性绑定到 SimpleText。

Everyting 在我注入 C# 实例时有效。但是我收到 BindingError ,在 F# 实例的情况下可以找到该属性。为什么会这样?

4

1 回答 1

3

我不太了解 WPF 绑定的工作原理,但要记住的一件事是 F# 中的接口是显式实现的(这意味着实现方法实际上是非公共的),但默认情况下它们是隐式的在 C# 中。如果在 C# 中使用显式接口实现会发生什么?如果这确实是问题,那么最简单的解决方法就是在您的 F# 类型上创建一个公共属性,该属性复制接口实现的行为。

于 2012-05-02T15:27:58.367 回答