【问题标题】:What should be the ViewModel members visibility?ViewModel 成员的可见性应该是什么?
【发布时间】:2023-03-12 01:01:01
【问题描述】:

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

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

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

引用the official documentationinternal 类型或成员只能在同一程序集中的文件中访问。

尽管 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 ...
}

【问题讨论】:

  • View 和 ViewModel 不是在同一个程序集中吗? 我不能回答这个问题。你在哪里定义的?
  • @ChrisDunaway 哎呀,你是对的!我现在已经修正了我的措辞......

标签: c# wpf mvvm


【解决方案1】:

具有internal 访问权限的ViewModelView 可见,但对Binding 类不可见,这确实使绑定工作。

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

【讨论】:

  • 不是我建议这样做,但现在我想知道如果您的程序集也有InternalsVisibleToPresentationCore 程序集,您是否可以使用internal。 .
  • 或许可以这样,但这样做有什么意义呢?
  • 绝对没有任何理由 :) - 我只是想知道在任何情况下可能是什么。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2017-03-09
    • 1970-01-01
    相关资源
    最近更新 更多