【问题标题】:how to use the same instance of the view in the navigationservice.navigate() in wpf如何在 wpf 的 navigationservice.navigate() 中使用相同的视图实例
【发布时间】:2019-05-15 21:06:00
【问题描述】:

我有两个视图(viewA 和 viewB),我在主窗口中使用导航服务在它们之间导航。多次导航后,我需要使用相同的 viewA 实例。

【问题讨论】:

    标签: wpf mvvm navigationservice


    【解决方案1】:

    我会让这个通用的。

    你没有说导航服务是什么或视图是什么。

    或者,自己维护您的视图列表。

    添加具有类型键和值页面(或对象或应用程序中的任何视图)的字典。

    当您导航时,您可以导航到一个类型并使用 .ContainsKey(theType) 检查您的字典中是否已经存在一个条目。如果那里有一个,则通过将其传递到您的导航过程来导航到该位置。如果那里没有,那么

    Activator.CreateInstance(theType)
    

    创建一个页面/视图/任何东西。

    将此添加到您的字典并导航到它。

    或者

    使用unity之类的依赖注入容器来为每个视图解析一个单例。

    无论哪种方式,您都可能需要一些新方法或对现有方法进行更改,具体取决于您的导航服务的功能。

    【讨论】:

      【解决方案2】:

      我正在使用Page 的实例来导航页面。 每个Page 可以有每个viewmodel 来保存数据。 并且,如果你想实时更新来自viewmodel的数据,你只需要绑定数据。

      MainWindow xaml

      <StackPanel>
          <Button Click="Button_Click">Change Page</Button>
          <Frame Name="ContentPage"></Frame>
      </StackPanel>
      

      代码背后的主窗口

          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;
          }
      

      【讨论】:

      • 此方法是否保留视图模型实例?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多