c# - 通过 F# 绑定(bind)到 View 模型的接口(interface)实现期间出现 BindingError

标签 c# wpf mvvm f#

大家好,很抱歉问了这么长的问题,但是...

我有一个像这样的 C# 接口(interface):

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

最终我有一个 super 简单的 WPF 应用程序,其中 MainWindow ctor 以这种方式注入(inject) 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 属性绑定(bind)到 SimpleText。

当我注入(inject) C# 实例时,一切正常。但是我收到 BindingError,在 F# 实例的情况下可以找到该属性。为什么会这样?

最佳答案

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

关于c# - 通过 F# 绑定(bind)到 View 模型的接口(interface)实现期间出现 BindingError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10416606/

相关文章:

c# - 如何在 ASP.NET Identity (WebForms) 中使用我自己的数据库

c# - 压缩小字符串,用什么创建外部字典?

c# - Windows 窗体应用程序命令行参数

c#调用c++ dll传输struct array发生异常

wpf - ViewModel 和用户界面项目位置

C# WPF 线程

c# - 使用 wpf 在列表框中绑定(bind)字典的键和值

c# - MVVM、DialogService 和对话结果

c# - WPF MVVM 复选框停止命令在数据绑定(bind)上触发

c# - 使用RX和.Buffer(TimeSpan),如何限制每批处理的项目数量?