我正在使用MVVM尝试一些不同的东西。在我们的ViewModel中,绑定到View的属性是公共的。我正在举一个按钮绑定的例子。这是一个简单的样本。
View.xaml:
<Button Content="Test Button" Command="{Binding TestButtonCommand}" />
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 { ...... }
答案 0 :(得分:18)
如果访问内部与公共相同,如果在同一工作 项目。那么为什么我们不能在这里使用内部。必须有一个理由 这些应该是公开的,我正在寻找这个理由。
您的答案仅在于您的问题,因为内部只能在同一个程序集中访问,而不能从外部访问。这是绑定到内部结构不起作用的唯一原因,因为绑定是通过绑定引擎解决的,而不是由程序集解决,而是在单独的程序集PresentationFramework.dll
中解决,如果您正在寻找它。
答案 1 :(得分:8)
Binding
仅支持公共属性。 MSDN参考:
http://msdn.microsoft.com/en-us/library/ms743643.aspx
引用中引用
您用作绑定的绑定源属性的属性必须 是你班级的公共财产。明确定义的接口 无法访问属性用于绑定目的,也不能保护, 没有基础的私有,内部或虚拟属性 实施
答案 2 :(得分:2)
显然,这取决于你从这种情况中想要实现的目标 - 你不能说明总体目标是什么。我刚刚遇到了与我的代码类似的问题,也发生在我的案例的解决方案上。 我的一个库包含具有各种属性的辅助对象,但是当在应用程序项目中使用它们时,我只想查看对我有用的属性 - 我想隐藏,例如,Command属性。
我的解决方案是将其隐藏在&#39;用户&#39;该库是添加
<EditorBrowsable(EditorBrowsableState.Never)>
属性对我很少或根本不感兴趣的每个属性。
希望能帮助别人!
答案 3 :(得分:1)
internal
可见性实际上只对编译器和IL验证器有意义,因为它们知道成员访问的完整上下文; WPF绑定引擎没有。它知道属性上存在绑定;它不知道是谁设置了这个属性。它可以在XAML中设置,也可以在运行时动态设置(从技术上讲,即使你在XAML中设置它,它仍然是动态应用的。)
由于无法强制执行访问规则,因此允许绑定internal
属性等同于允许绑定private
属性,而不是public
属性。
答案 4 :(得分:0)
创建内部属性正在破坏良好的OO设计并打破封装。 您可以为您的案例使用内部设置访问器(和公共访问访问器)。
public ICommand SaveCommand
{
get;
internal set;
}
如果您将一个字段封装到一个属性中,那么您应该规定,即使在您的类中,也始终通过属性访问该字段。这是最好的做法。
答案 5 :(得分:0)
来自http://msdn.microsoft.com/en-us/library/ms743643.aspx
对于CLR属性,数据绑定与绑定引擎一样长 能够使用反射访问绑定源属性。 否则,绑定引擎会发出属性警告 无法找到并使用后备值或默认值if 它可用。
答案 6 :(得分:0)
不可能绑定到内部属性。如果您不希望在项目外部访问您的班级,则可以将其设为内部班级。