Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个项目之间的Silverlight导航_Silverlight - Fatal编程技术网

多个项目之间的Silverlight导航

多个项目之间的Silverlight导航,silverlight,Silverlight,这可能很简单,但我们仍在努力解决这一问题 我们正在使用Silverlight和MVVM,假设我们有两个Silverlight类库,每个类库都有一个视图和视图模型 如果每个视图上都有一个按钮,上面写着“转到其他视图”,那么如何设置导航以显示其他视图/视图模型而不创建循环引用?既然您使用的是MVVM,正确的做法是使用事件聚合器。每个视图模型都可能触发一个“NavigationRequested”事件,然后顶层应该侦听该事件并进行相应的导航。举个简单的例子: private void Applicat

这可能很简单,但我们仍在努力解决这一问题

我们正在使用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;
}
private void应用程序\u启动(对象发送方,StartupEventArgs e)
{
IEventPublisher publisher=new EventPublisher();
var viewModel=新的viewModel(publisher);
var view1=newview1{DataContext=viewModel};
var view2=newview2{DataContext=viewModel};
this.RootVisual=view1;
view1.DataContext=viewModel;
publisher.Get()
.ObserveOnDispatcher()
.Select(项=>item.ViewName)
.Subscribe(name=>RootVisual=name==“View1”?View1:view2);
this.RootVisual=view1;
}
请注意,我上面使用的语法来自,但是无论您使用的是哪个MVVM框架(如果有的话),都应该应用相同的思想