как использовать тот же экземпляр представления в navigationservice.navigate () в wpf

У меня есть два представления (viewA и viewB), в которых я перемещаюсь между ними в главном окне с помощью службы навигации. Мне нужно использовать один и тот же экземпляр viewA после нескольких переходов.


person Galilo Galilo    schedule 15.05.2019    source источник


Ответы (2)


Я бы сделал это общим.

Вы не говорите, что такое навигационный сервис или каковы представления.

Либо составьте список просмотров самостоятельно.

Добавьте словарь с ключом типа и страницей значения (или объекта, или любого другого представления в вашем приложении).

При навигации вы можете перейти к типу и проверить, есть ли уже запись в вашем словаре, используя .ContainsKey (theType). Если он там есть, перейдите к нему, передав его в свой процесс навигации. Если там никого нет, тогда

Activator.CreateInstance(theType)

Чтобы создать страницу / просмотр / что угодно.

Добавьте это в свой словарь и перейдите к нему.

Or

Используйте контейнер внедрения зависимостей, такой как unity, чтобы разрешить синглтон для каждого представления.

В любом случае вам может потребоваться какой-то новый метод или изменения в существующем, в зависимости от того, что делает ваша навигационная служба.

person Andy    schedule 15.05.2019

Я использую экземпляр 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;
    }
person yaho cho    schedule 15.05.2019
comment
Сохраняет ли этот метод экземпляр модели представления? - person Galilo Galilo; 15.05.2019