Решение, которое Сэм предложил здесь, является правильным.
Чего вы не получили, так это того, что у вас должен быть только один экземпляр вашей модели представления, а ваша главная и дочерняя страницы должны ссылаться на один и тот же.
Ваша view-модель должна быть запущена один раз: может быть, вам нужен Locator и получить экземпляр там ... Делая так, код в вашем ctor будет запускаться один раз, взгляните на инструментарий mvvmLight, я думаю, он будет хорош для вашего использования вы можете избавиться от тех классов, реализующих ICommand тоже ...
Вы можете найти отличный пример использования этого шаблона здесь:
http://blogs.msdn.com/b/kylemc/archive/2011/04/29/mvvm-pattern-for-ria-services.aspx
в основном то, что происходит, это:
у вас есть локатор
public class ViewModelLocator
{
private readonly ServiceProviderBase _sp;
public ViewModelLocator()
{
_sp = ServiceProviderBase.Instance;
// 1 VM for all places that use it. Just an option
Book = new BookViewModel(_sp.PageConductor, _sp.BookDataService);
}
public BookViewModel Book { get; set; }
//get { return new BookViewModel(_sp.PageConductor, _sp.BookDataService); }
// 1 new instance per View
public CheckoutViewModel Checkout
{
get { return new CheckoutViewModel(_sp.PageConductor, _sp.BookDataService); }
}
}
этот локатор является StaticResource, в App.xaml
<Application.Resources>
<ResourceDictionary>
<app:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</ResourceDictionary>
</Application.Resources>
в ваших представлениях вы ссылаетесь на модели представления через локатор:
DataContext="{Binding Book, Source={StaticResource Locator}}"
здесь Book - это экземпляр BookViewModel, вы можете увидеть его в классе Locator
BookViewModel имеет выбранную книгу:
private Book _selectedBook;
public Book SelectedBook
{
get { return _selectedBook; }
set
{
_selectedBook = value;
RaisePropertyChanged("SelectedBook");
}
}
и ваше дочернее окно должно иметь тот же DataContext, что и ваш MainView, и работать так:
<Grid Name="grid1" DataContext="{Binding SelectedBook}">