У меня есть два представления (viewA и viewB), в которых я перемещаюсь между ними в главном окне с помощью службы навигации. Мне нужно использовать один и тот же экземпляр viewA после нескольких переходов.
как использовать тот же экземпляр представления в navigationservice.navigate () в wpf
Ответы (2)
Я бы сделал это общим.
Вы не говорите, что такое навигационный сервис или каковы представления.
Либо составьте список просмотров самостоятельно.
Добавьте словарь с ключом типа и страницей значения (или объекта, или любого другого представления в вашем приложении).
При навигации вы можете перейти к типу и проверить, есть ли уже запись в вашем словаре, используя .ContainsKey (theType). Если он там есть, перейдите к нему, передав его в свой процесс навигации. Если там никого нет, тогда
Activator.CreateInstance(theType)
Чтобы создать страницу / просмотр / что угодно.
Добавьте это в свой словарь и перейдите к нему.
Or
Используйте контейнер внедрения зависимостей, такой как unity, чтобы разрешить синглтон для каждого представления.
В любом случае вам может потребоваться какой-то новый метод или изменения в существующем, в зависимости от того, что делает ваша навигационная служба.
Я использую экземпляр Page
для навигации по страницам. Каждый Page
может иметь каждый viewmodel
для хранения данных. И вам просто нужно привязать данные, если вы хотите обновлять данные из viewmodel
в режиме реального времени.
MainWindow xaml
<StackPanel>
<Button Click="Button_Click">Change Page</Button>
<Frame Name="ContentPage"></Frame>
</StackPanel>
MainWindow Behind Code
private Page viewA = new ViewA();
private Page viewB = new ViewB();
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
private int page;
public void Button_Click(object sender, EventArgs e)
{
page++;
if (page % 2 == 0)
ContentPage.Navigate(viewA);
else
ContentPage.Navigate(viewB);
}
ViewA xaml
<Grid>
<TextBlock Name="ViewAText"/>
</Grid>
ViewA за кодом
public ViewA()
{
InitializeComponent();
DataContext = new ViewAViewModel();
ViewAViewModel viewmodel = DataContext as ViewAViewModel;
ViewAText.Text = viewmodel.text;
}
ViewB xaml
<Grid>
<TextBlock Name="ViewBText"/>
</Grid>
ViewB за кодом
public ViewB()
{
InitializeComponent();
DataContext = new ViewBViewModel();
ViewBViewModel viewmodel = DataContext as ViewBViewModel;
ViewBText.Text = viewmodel.text;
}