В WPF почему связанные свойства являются открытыми, а подписка на события является частной? - PullRequest
0 голосов
/ 13 сентября 2018

Я новичок в мире 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, и теперь Country_SelectionChanged может быть закрытым. Но почему этого не происходит с привязкой? Если мы устанавливаем свойство как общедоступное, то работает только код.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Связывание выполняется с использованием отражения, чтобы выяснить общедоступные свойства типа DataContext.Это связано с тем, что ваш DataContext может быть классом, отличным от представления, обычно это класс представления модели в сценариях MVVM.

С другой стороны, ваш обработчик событий всегда находится в одном классе, а модификатор доступа privateдостаточно для доступа к этому.

0 голосов
/ 13 сентября 2018

Есть небольшое недоразумение.private void Country_SelectionChanged(...) не ваше мероприятие;это просто обработчик события.Все еще существует открытое событие SelectionChanged.

Возьмем, к примеру, INotifyPropertyChanged.У него есть такое событие:

public event PropertyChangedEventHandler PropertyChanged;  

event - это то, что вы фактически используете, когда делаете PropertyChanged += MyFooHandler.

MyFooHandler, может быть общедоступным, частным, внутренним,и т. д. Неважно, что это за метод доступа, но событие должно иметь надлежащую видимость, чтобы в него можно было что-то связать.

Свойства привязки WPF должны быть общедоступными, чтобы сама структура могла легко ее видеть и творить чудеса.За кулисами гораздо больше, чем просто {Binding Foo}.;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...