在 WPF 中,为什么绑定属性是公共的,而事件订阅是私有的?

  • 本文关键字:事件 WPF 绑定 属性 c# wpf xaml
  • 更新时间 :
  • 英文 :


我是WPF世界的新手,刚开始阅读WPF。在阅读时,我发现每当我们将某个元素绑定到该属性背后的代码中的属性时,该属性始终需要是公共的,并且需要设置 DataContext,即使该属性位于 xaml .cs 文件中。但订阅事件的方法可以是私有的。

例如: 在下面的示例中,SelectedCountryIndex 属性是公共的Country_SelectionChanged但该方法是私有的。

XAML 文件:

<ComboBox Name="Countries" SelectedIndex="{Binding SelectedCountryIndex}" SelectionChanged="Country_SelectionChanged"/>

XAML.cs

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
public int SelectedCountryIndex{ get; set; } = 0;
private void Country_SelectionChanged(object sender, SelectionChangedEventArgs e){}
}

现在根据这篇文章,Mainwindow.xaml.cs的类是部分的,就像MainWindow.xaml的类一样,因此我们可以直接编写 国家/地区.选择已更改+=Country_SelectionChanged 现在Country_SelectionChanged可以是私有的。 但是为什么绑定不会发生这种情况呢?如果我们将属性设置为公共,则只有代码有效。

有一个小小的误解。private void Country_SelectionChanged(...)不是你的活动;它只是事件的处理程序。仍然有一个公共事件 选择更改.

INotifyPropertyChanged为例。它有一个这样的事件:

public event PropertyChangedEventHandler PropertyChanged;  

event是您在执行PropertyChanged += MyFooHandler时实际使用的内容。

MyFooHandler可以是公共的、私有的、内部的等。访问器是什么并不重要,但事件需要具有适当的可见性,以允许将内容连接到其中。

WPF 绑定的属性必须是公共的,以便框架本身可以轻松查看它并发挥其魔力。幕后还有更多的事情,而不仅仅是拥有{Binding Foo}。;)

绑定是使用反射来完成的,以找出 DataContext 类型的公共属性。这是因为 DataContext 可以是与视图不同的类,通常是 MVVM 方案中的视图模型类。

另一方面,您的事件处理程序始终位于同一类中,并且访问修饰符private足以访问它。

最新更新