为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
呼啦一阵风 2022-01-16 15:37:27
我是 WPF 世界的新手,刚开始阅读 WPF。在阅读时,我发现每当我们将某些元素绑定到该属性后面的代码中的属性时,该属性始终需要是公共的,并且即使该属性位于 xaml.cs 文件中,也需要设置 DataContext。但是订阅事件的方法可以是私有的。例如:在以下示例中,SelectedCountryIndex 属性是公共的,但 Country_SelectionChanged 方法是私有的。xml文件:<ComboBox Name="Countries" SelectedIndex="{Binding SelectedCountryIndex}" SelectionChanged="Country_SelectionChanged"/>xml.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 并且现在 Country_SelectionChanged 可以是私有的。但是为什么绑定不会发生这种情况?如果我们将属性设置为公共,那么只有代码有效。
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

有一点小误会。private void Country_SelectionChanged(...)不是您的活动;它只是事件的处理程序。仍然有一个 SelectionChanged 的公共事件。

举个例子INotifyPropertyChanged。它有一个像这样的事件:

public event PropertyChangedEventHandler PropertyChanged;

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

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

WPF 绑定的属性需要公开,以便框架本身可以轻松地看到它并发挥它的魔力。幕后不仅仅是拥有{Binding Foo}. ;)


查看完整回答
反对 回复 2022-01-16
?
富国沪深

TA贡献1790条经验 获得超9个赞

绑定使用反射来确定 DataContext 类型的公共属性。这是因为您的 DataContext 可以是与视图不同的类,通常是 MVVM 场景中的 View Model 类。

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


查看完整回答
反对 回复 2022-01-16
  • 2 回答
  • 0 关注
  • 280 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信