【问题标题】:In WPF why binded properties are public but the event subscription is private?在 WPF 中,为什么绑定的属性是公共的,而事件订阅是私有的?
【发布时间】:2019-02-18 15:29:02
【问题描述】:

我是 WPF 世界的新手,刚开始阅读 WPF。在阅读时,我发现每当我们将某些元素绑定到该属性后面的代码中的属性时,该属性始终需要是公共的,并且即使该属性位于 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 的类一样是部分的,因此我们可以直接编写 Country.SelectionChanged+=Country_SelectionChanged 现在 Country_SelectionChanged 可以是私有的。 但是为什么绑定不会发生这种情况?如果我们将属性设置为公开,那么只有代码有效。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      public event PropertyChangedEventHandler PropertyChanged;  
      

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 2017-04-02
        • 1970-01-01
        • 2011-05-11
        • 2018-05-09
        • 2017-12-09
        • 1970-01-01
        • 2011-06-01
        • 2015-07-15
        相关资源
        最近更新 更多