【发布时间】:2019-05-15 21:06:00
【问题描述】:
我有两个视图(viewA 和 viewB),我在主窗口中使用导航服务在它们之间导航。多次导航后,我需要使用相同的 viewA 实例。
【问题讨论】:
标签: wpf mvvm navigationservice
我有两个视图(viewA 和 viewB),我在主窗口中使用导航服务在它们之间导航。多次导航后,我需要使用相同的 viewA 实例。
【问题讨论】:
标签: wpf mvvm navigationservice
我会让这个通用的。
你没有说导航服务是什么或视图是什么。
或者,自己维护您的视图列表。
添加具有类型键和值页面(或对象或应用程序中的任何视图)的字典。
当您导航时,您可以导航到一个类型并使用 .ContainsKey(theType) 检查您的字典中是否已经存在一个条目。如果那里有一个,则通过将其传递到您的导航过程来导航到该位置。如果那里没有,那么
Activator.CreateInstance(theType)
创建一个页面/视图/任何东西。
将此添加到您的字典并导航到它。
或者
使用unity之类的依赖注入容器来为每个视图解析一个单例。
无论哪种方式,您都可能需要一些新方法或对现有方法进行更改,具体取决于您的导航服务的功能。
【讨论】:
我正在使用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;
}
【讨论】: