Я могу использовать привязку данных для установки начального Содержания Кадра WPF, но последующие изменения связанное свойство (реализованное использование INotifyPropertyChange), кажется, не изменяют содержание.
Кроме того, кто-либо знает, если привязка непосредственно к свойству Content таким образом заставит связанный объект появляться в Кадре или журнале NavigationWindow?
Некоторый контекст: Я понимаю, что должен, вероятно, использовать NavigationService для взаимодействия с Кадром, но я пытаюсь следовать за шаблоном MVVM. Кажется, что было бы намного более просто связать с данными к свойству Content...
Многие в сообществе WPF согласны с тем, что встроенная среда навигации не работает. Однако, даже если бы вы использовали его, привязка свойства Content не является правильным подходом. Если вы хотите использовать MVVM с навигацией, вы должны объединить его с шаблоном FrontController, где ViewModel отправляет запрос навигации в контроллер, который затем разрешает этот запрос за вас. Доступно не так много примеров этой концепции, потому что (как я уже упоминал ранее) многие разработчики переходят на использование встроенной навигации WPF.
Если вы хотите взглянуть на очень надежный механизм навигации для WPF, посмотрите на nRoute . Это порт механизма маршрутизации MVC для WPF.
Фрейм - это узел навигации, поэтому правильнее использовать NavigationService для перехода к другому контенту. Если вы используете INotifyPropertyChange, я полагаю, что вы вызываете связанное событие всякий раз, когда изменяется контент. Тогда я также полагаю, что вместо этого нетрудно использовать NavigationService.
Вы можете использовать привязку данных к фрейму, но вам нужно убедиться, что для режима привязки установлено значение TwoWay.
XAML:
<Frame Content={Binding Path=MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} />
Просмотр модели:
public class MyViewModel : INotifyPropertyChanging, INotifyPropertyChanged
{
public Page MyProperty
{
get
{
return _viewModelPage;
}
set
{
this.OnPropertyChanging("MyProperty");
_viewModelPage = value;
this.OnPropertyChanged("MyProperty");
}
}
}