Привязка к DependencyProperty не работает

Я создал DP следующим образом:

 public static readonly DependencyProperty SchoolsViewModelProperty =
        DependencyProperty.Register("SchoolsViewModel", typeof(SchoolsViewModel), typeof(SchoolChooser), new PropertyMetadata(default(SchoolsViewModel)));
 public SchoolsViewModel SchoolsViewModel
 {
    get
    {
        return (SchoolsViewModel)GetValue(SchoolsViewModelProperty);
    }

    set
    {
       SetValue(SchoolsViewModelProperty, value);
       this.OnPropertyChanged();
    }
 }
 public event PropertyChangedEventHandler PropertyChanged;

 [NotifyPropertyChangedInvocator]
 private void OnPropertyChanged([CallerMemberName] string propertyName = null)
 {
     PropertyChangedEventHandler handler = PropertyChanged;
     if (handler != null)
     {
         handler(this, new PropertyChangedEventArgs(propertyName));
     }
 }

Далее я связываю его с DataContext:

<common:LayoutAwarePage
    ...
    DataContext="{Binding ElementName=SchoolChooserPage, Path=SchoolsViewModel}"/>

Затем я устанавливаю свойство в конструкторе:

public SchoolChooser()
{
    this.InitializeComponent();

    this.SchoolsViewModel = new SchoolsViewModel { Schools = TypeService.Resolve<ISchoolContext>().Schools };
}

К сожалению, DataContext всегда нулевой. Мне кажется, что привязка не работает. Я понятия не имею, почему такой способ работал в wpf.

Когда я устанавливаю DataContext прямо как:

this.DataContext = this.SchoolsViewModel;

Все отлично. Зачем? Что, хотя я реализовал INotfiyProperyChanged, событие ProperyChanged равно нулю.

1 ответ

Вам не нужно INotifyPropertyChanged с DependencyPropertys. Может быть, удаление этого даст вам лучший взгляд на проблему.

Интересно, почему в вашем View есть свойство для модели представления. Разве модель представления не должна входить в DataContext? Я ожидаю, что ваши View и ViewModel будут независимы с другим экземпляром, таким как Application создавая оба объекта и соединяя их, устанавливая виды DataContext к экземпляру ViewModel.

Пример:

var view = new View();
var viewModel = new ViewModel();

view.DataContext = viewModel;

view.Show();
Другие вопросы по тегам