Я думаю, что навигационные кнопки не являются частью элемента управления Window1
и привязываются к Window1ViewModel
, который является DataContext
из Window1
. Если это так, вы должны повторно использовать один и тот же экземпляр Window1ViewModel
для каждого экземпляра Window1
.
MainWindow.xaml.cs
partial class MainWindow : Window
{
private Window1ViewModel Window1ViewModel { get; set; }
public MainWindow()
{
this.Window1ViewModel = new Window1ViewModel();
}
private void ShowWindow1()
{
Window1 window = new Window1();
window.DataContext = this.Window1ViewModel;
window.Show();
}
}
При создании Требуется новый экземпляр Window1ViewModel
, тогда вам следует изменить дизайн представления и переместить навигационные кнопки к элементу управления Window1
.
Замечания
Я попытаюсь объяснить, почему у вас есть повторно использовать начальный экземпляр Window1ViewModel
в вашей текущей реализации.
Это вопрос объема и экземпляров или ссылок на экземпляры.
Давайте возьмем вашу первоначальную настройку в качестве контекста: у нас есть первый элемент управления, например, Button
, который связывается с DataContext
, например, Window1ViewModel
второго элемента управления, например, Window1
.
. привязки к Window1ViewModel
изначально работают, но когда вы закрываете Window1
и открываете новый экземпляр Window1
, эти привязки больше не работают.
Чтобы понять, что на самом деле происходит, вы должны помнить, что Вы имеете дело не с классами, а с экземплярами классов. Вы можете иметь несколько экземпляров одного и того же класса.
Как правило, информация о привязке (исходный объект и целевой объект привязки данных) сохраняется в экземпляре класса Binding
.
Теперь при настройке привязки XAML для свойства первого элемента управления (Button.Command
), например, для привязки к команде экземпляра Window1ViewModel
, каркас создаст новый экземпляр Binding
, где его свойство Binding.Target
установлено на Button.Command
(свойство текущего экземпляра Button
), а свойство Binding.Source
установлено на текущий (первый) экземпляр из Window1ViewModel
(и к свойству экземпляра, например NextPageCommand
).
Вы показываете окно следующим образом:
private void ShowWindow1()
{
Window1 window = new Window1();
window.DataContext = new Window1ViewModel();
window.Show();
}
Когда вы закрываете Window1
и выходите из области действия переменной экземпляра window
, вы не можете получить доступ к первому экземпляру Window1ViewModel
больше, потому что единственная ссылка на этот экземпляр была сохранена в свойстве DataContext
Window1
. Но все еще , привязка Button
ссылается на первый экземпляр Window1ViewModel
.
Затем вы решаете показать новое окно и создать новый (второй) экземпляр Window1
и назначьте ему новый (второй) экземпляр Window1ViewModel
. Как теперь привязка к новому экземпляру Window1ViewModel
?
Даже когда вы повторно используете первый экземпляр Window1
и просто добавляете новый экземпляр Window1ViewModel
к Window1.DataContext
, привязка все еще ссылается на первый (начальный) экземпляр Window1ViewModel
.
Binding
не является производным от DependencyObject
и поэтому не реализует его свойства как DependencyProperty
. Это означает, что Binding.Source
не является DependencyProperty
и не может инициировать изменения свойств, и поэтому не будет обновлять ссылку, чтобы указывать на второй экземпляр Window1ViewModel
. Вот почему повторное использование начального экземпляра Window1ViewModel
решает проблему (Binding.Source
все еще ссылается на него).
В качестве альтернативы вы могли бы заменить экземпляр Binding
при замене экземпляра binging source. Но для этого потребуется написать более сложный код C#, без помощи конструктора XAML для разрешения текущего DataContext
.
Решение
При взгляде на логи c вы пытаясь реализовать, на самом деле не имеет смысла иметь один набор кнопок навигации для навигации по нескольким независимым windows.
Если вы решили иметь несколько Window1
экземпляров, работающих параллельно, то вы должны позволить Window1
обрабатывать навигацию самостоятельно.
Window1.xaml
<window>
<StackPanel>
<Button x:Name="LoadPreviousButton"
Command="ShowPreviousCommand}" />
<Button x:Name="LoadNextButton"
Command="ShowNextCommand}" />
<ContentPresenter Content="{Binding CurrentPage}" />
</StackPanel>
</Window>
Теперь вы можете иметь столько экземпляров Window1
, сколько вам нужно, причем каждый экземпляр Window1
может иметь выделенный экземпляр Window1ViewModel
:
// This will now behave as you expected it to
var window = new Window1() { DataContext = new Window1ViewModel() };
window.Show();