8

我遇到了一个有趣的问题,但我还没有找到任何解释......

鉴于下面非常简单的 MVVM WPF 应用程序,为什么列表仅在 ViewModel 中的可见性设置为时才绑定到组合框public

TestList将可见性更改为internal在编译时不会引发错误或警告,但在运行时将组合框留空。

引用官方文档internal类型或成员只能在同一程序集中的文件中访问。

尽管 View 和 ViewModel 是在同一个程序集中定义的,但这个问题仍然存在。

代码如下所示:

模型:

class TestModel
{
    internal List<string> Musketeers { get; private set; }

    public TestModel()
    {
        Musketeers = new List<string> { "Athos", "Porthos", "Aramis" };
    }
}

看法:

<Window x:Class="TestWpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <ComboBox Width="250" Height="25" ItemsSource="{Binding TestList}" />
    </Grid>
</Window>

视图模型:

class TestViewModel : INotifyPropertyChanged
{
    TestModel myModel = new TestModel();

    public List<string> TestList
    {
        get
        {
            return myModel.Musketeers;
        }
    }

    // INotifyPropertyChanged members are below ...
}
4

2 回答 2

7

ViewModelwith internalaccess 对 是可见的View,但对类不可见Binding,这确实使绑定起作用。

{Binding TestList}被转换成Binding类实例,它不知道internal你的ViewModel类成员。

于 2013-03-13T21:11:31.120 回答
6

这是因为数据绑定使用反射,而反射又遵循项目的可见性。由于数据绑定是在程序集之外实现的 - 在 WPF 库中 - 它不能看到非公共成员。

绑定到不存在的成员不会发出运行时错误,而是带有包含有关缺失成员详细信息的消息的调试输出。

于 2013-03-13T21:11:58.087 回答