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

时间:2018-09-13 20:34:20

标签: c# wpf xaml

我是WPF的新手,刚刚开始阅读WPF。在阅读时,我发现无论何时我们将某些Element绑定到代码中的属性之后,该属性始终需要公开,并且即使该属性位于xaml.cs文件中,也需要设置DataContext。但是订阅该事件的方法可以是私有的。

例如: 在下面的示例中,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){}
}

现在按照this post,Mainwindow.xaml.cs的类像MainWindow.xaml的类一样是局部的,因此我们可以直接编写 States.SelectionChanged + = Country_SelectionChanged,现在Country_SelectionChanged可以是私有的。 但是,为什么绑定不会发生这种情况?如果将属性设置为public,那么只有代码有效。

1 个答案:

答案 0 :(得分:2)

有些误解。 private void Country_SelectionChanged(...)不是您的活动;它只是事件的处理程序。还有一个公共事件SelectionChanged。

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

public event PropertyChangedEventHandler PropertyChanged;  

event是您实际使用的PropertyChanged += MyFooHandler

MyFooHandler可以是公共的,私有的,内部的,等等。访问者是什么都没有关系,但是事件需要具有适当的可见性以允许事物连接到其中。

WPF绑定的属性需要公开,以便框架本身可以轻松看到它并发挥其魔力。除了拥有{Binding Foo},幕后还有更多。 ;)