在ViewModel中使绑定属性内部而不是公共

我正在使用MVVM尝试一些不同的东西。 在我们的ViewModel中,绑定到View的属性是公共的。 我正在举一个按钮绑定的例子。 这是一个简单的例子。

View.xaml:

ViewModel.cs

 private ICommand _testButtonCommand; public ICommand TestButtonCommand { get { return _testButtonCommand?? (_testButtonCommand= new RelayCommand(SomeMethod)); } } 

在这里我的问题是,我们可以将TestButtonCommand内部而不是公共吗? 内部意味着它可以被当前项目访问,所以他们不应该有任何问题吗? 但是,当我试图这样做时,它没有奏效。 在getter中添加断点没有被击中。 那么为什么我们不能把它变成内部的呢。

这是msdn的链接。

http://msdn.microsoft.com/en-us/library/ms743643.aspx

用作绑定的绑定源属性的属性必须是类的公共属性。 无法为绑定目的访问显式定义的接口属性,也无法访问没有基本实现的受保护,私有,内部或虚拟属性。

为什么我们不能这样做? 如果访问内部与公共相同,如果在同一项目中工作。 那么为什么我们不能在这里使用内部。 必须有一个理由,这些应该是公开的,我正在寻找这个理由。

 internal ICommand TestButtonCommand { ...... } 

如果访问内部与公共相同,如果在同一项目中工作。 那么为什么我们不能在这里使用内部。 必须有一个理由,这些应该是公开的,我正在寻找这个理由。

您只回答了问题,因为内部只能在同一个程序集中访问,而不能从外部访问。 这是绑定到内部结构不起作用的唯一原因,因为绑定是通过绑定引擎而不是你的程序集来解决的,并且它在单独的程序集PresentationFramework.dll中是准确的,如果你正在寻找它。

仅对公共属性支持Binding 。 MSDN参考:

http://msdn.microsoft.com/en-us/library/ms743643.aspx

正如参考文献中引用的那样

用作绑定的绑定源属性的属性必须是类的公共属性。 无法为绑定目的访问显式定义的接口属性,也无法访问没有基本实现的受保护,私有,内部或虚拟属性。

显然,这取决于你在这种情况下想要实现的目标 – 你没有说明总体目标是什么。 我刚刚遇到了与我的代码类似的问题,也发生在我的案例的解决方案上。 我的一个库包含具有各种属性的辅助对象,但是当在应用程序项目中使用它们时,我只想查看对我有用的属性 – 我想隐藏,例如,Command属性。

我将它们隐藏在库的“用户”中的解决方案是添加

  

归因于对我很少或根本不感兴趣的每个属性。

希望有人帮助!

internal可见性实际上只对编译器和ILvalidation器有意义,因为它们知道成员访问的完整上下文; WPF绑定引擎没有。 它知道属性上存在绑定; 它不知道是谁设置了这个属性。 它可以在XAML中设置,也可以在运行时动态设置(从技术上讲,即使您在XAML中设置它,它仍然是动态应用的)。

由于无法强制执行访问规则,因此允许绑定到internal属性等同于允许绑定到private属性,而不是public属性。

创建的内部属性正在破坏良好的OO设计并打破封装。 您可以为您的案例使用内部设置访问器(和公共访问访问器)。

 public ICommand SaveCommand { get; internal set; } 

如果您将一个字段封装到一个属性中,那么您应该规定,即使在您的类中,也始终通过属性访问该字段。 这是最好的做法。

来自http://msdn.microsoft.com/en-us/library/ms743643.aspx

对于CLR属性,只要绑定引擎能够使用reflection访问绑定源属性,数据绑定就会起作用。 否则,绑定引擎会发出无法找到属性的警告,并使用回退值或默认值(如果可用)。

无法绑定到内部属性。 如果您不希望您的课程在项目之外可访问,您可以将您的课程设为内部课程。