15

I am trying some different things using MVVM. In our ViewModel properties which are bind to View are public. I am taking example of a button binding. Here is a simple sample.

View.xaml:

<Button Content="Test Button" Command="{Binding TestButtonCommand}" />

ViewModel.cs

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

Here my question is that can we make TestButtonCommand internal instead of public? Internal means it is accessible to current project so their should not be any problem doing that? But when I tried to do that it didn't worked. Adding a breakpoint in getter was not hit. So why we cannot make it internal?

Here is the link from msdn.

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

The properties you use as binding source properties for a binding must be public properties of your class. Explicitly defined interface properties cannot be accessed for binding purposes, nor can protected, private, internal, or virtual properties that have no base implementation.

Why we cannot do this?

In case of access internal is same as public if working in the same project. Then why we cannot use internal here? There must be a reason that these should be public, and I am looking for that reason.

internal ICommand TestButtonCommand { ...... }
4

7 回答 7

26

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

在 Microsoft 的引文中,您的问题本身就有部分答案:

用作绑定的绑定源属性的属性必须是类的公共属性

据推测/推测,其原因是内部只能在同一个程序集中访问,而不能从外部访问。绑定到内部不起作用,因为绑定由位于单独程序集中的 WPF 绑定引擎解析PresentationFramework.dll

于 2013-11-02T17:04:11.553 回答
11

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

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

如参考文献中所引用

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

于 2013-10-31T10:41:26.047 回答
2

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

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

于 2013-10-31T11:13:57.863 回答
2

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

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

<EditorBrowsable(EditorBrowsableState.Never)>

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

希望对某人有所帮助!

于 2016-09-20T15:43:13.313 回答
1

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

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

于 2015-01-17T09:19:28.287 回答
0

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

public ICommand SaveCommand
{
    get;
    internal set;
}

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

于 2013-10-31T11:00:09.560 回答
0

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

于 2018-10-10T13:39:59.420 回答