这可能很简单,但我们仍在为此苦苦挣扎。
我们正在使用 Silverlight 和 MVVM,假设我们有两个 silverlight 类库,每个类库都有一个视图和视图模型。
如果我们在每个视图上都有一个按钮显示转到另一个视图,我们如何设置导航以显示另一个视图/视图模型而不创建循环引用?
这可能很简单,但我们仍在为此苦苦挣扎。
我们正在使用 Silverlight 和 MVVM,假设我们有两个 silverlight 类库,每个类库都有一个视图和视图模型。
如果我们在每个视图上都有一个按钮显示转到另一个视图,我们如何设置导航以显示另一个视图/视图模型而不创建循环引用?
由于您使用的是 MVVM,因此正确的是使用事件聚合器。每个视图模型都可以触发一个“NavigationRequested”事件,然后顶层应该监听该事件并进行相应的导航。举个简单的例子:
private void Application_Startup(object sender, StartupEventArgs e)
{
IEventPublisher publisher = new EventPublisher();
var viewModel = new ViewModel(publisher);
var view1 = new View1 { DataContext = viewModel };
var view2 = new View2 { DataContext = viewModel };
this.RootVisual = view1;
view1.DataContext = viewModel;
publisher.Get<NavigationRequested>()
.ObserveOnDispatcher()
.Select(item => item.ViewName)
.Subscribe(name => RootVisual = name == "View1" ? view1 : view2);
this.RootVisual = view1;
}
请注意,我上面使用的语法来自使用 RX extensions 的事件聚合器,但无论您使用的是哪个 MVVM 框架(如果有),都应该适用相同的想法。