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





Небольшое недоразумение. private void Country_SelectionChanged(...) - это не ваше мероприятие; это просто обработчик события. Еще есть публичное мероприятие SelectionChanged.
Взять, к примеру, INotifyPropertyChanged. У него есть такое событие:
public event PropertyChangedEventHandler PropertyChanged;
event - это то, что вы фактически используете, когда делаете PropertyChanged += MyFooHandler.
MyFooHandler может быть общедоступным, частным, внутренним и т. д. Не имеет значения, какой является аксессор, но событие должно иметь надлежащую видимость, чтобы вещи могли подключаться к нему.
Свойства привязки WPF должны быть общедоступными, чтобы сам фреймворк мог легко их видеть и творить чудеса. За кулисами скрывается гораздо больше, чем просто наличие {Binding Foo}. ;)
Связывание выполняется с использованием отражения для определения общедоступных свойств типа DataContext. Это связано с тем, что ваш DataContext может отличаться от класса представления, обычно это класс модели представления в сценариях MVVM.
С другой стороны, ваш обработчик событий всегда находится в том же классе, и модификатор доступа private достаточно хорош для доступа к нему.