以编程方式从 ViewModel 中的选项卡项导航到另一个选项卡项

Navigation from Tab Item to another Tab item from a ViewModel programmatically

主要windowXaml

<StackPanel>
        <TabControl x:Name="MainTabControl" SelectedIndex="{Binding selected}">            
            <TabItem Header="Entry Form" TabIndex="0">
                <views:EntryForm />
            </TabItem>            
            <TabItem Header="Result" TabIndex="1">
                <views:DistanceResults />
            </TabItem>   
        </TabControl>
    </StackPanel>

报名表XAML

    <Button
        Command="{Binding MeasureDistanceCommand}"                    
        Content="Measure Distances"
       Style="{StaticResource BtnGreen}" />
   private void MeasureDistance()
        {
            if (!Helper.TryParseLatitude(StartLatitude, out var latitude)) return;
            if (!Helper.TryParseLongitude(StartLongitude, out var longitude)) return;

            var Startlocation = new Location(latitude, longitude);

            //todo iterate through he list of the end points and measure there distance
            //todo pass the values to the result tab
            //todo navigate to the result tab



        }

我正在使用 WPF C# MVVM - 有一个标准的 BaseViewModel 我在主 window 和 2 个选项卡项中有一个 TabControl。

我尝试做的是当单击 EntryForm 上的“测量距离”按钮并且 EntryFormViewModel 中的命令完成为结果视图准备数据时。我想以编程方式激活 DistanceResults TabItem 并将其传递给它需要显示的数据。

这是一个 WPF 距离测量应用程序,它是开源的,正在我的 Twitch 流上开发,但我还没有找到一种方法来完成我上面提到的事情。该项目在这里

https://github.com/copperbeardy/GPSDistanceMeasure

感谢任何帮助和建议

我认为您可以将 Tabitem 中的 IsSelected 属性 绑定到一个布尔值以有点强制 selection,但是,它应该在作为整个 tabcontrol 的数据上下文的视图模型中完成,并利用 prism 的事件聚合器将数据发送到另一个 VM。

Event Aggregator

流程可能是这样的:

  1. 结果准备就绪后,您可以发布事件并将结果作为该事件的负载发送。
  2. 在结果视图模型中订阅该事件以设置应显示的所有数据。
  3. 在作为 tabcontrol 的数据控件的视图模型中订阅相同的事件,在处理程序中,您可以将 "IsResultsSelected" 之类的布尔值设置为 true。

因此,您可以同时做两件事,发送数据和 select 选项卡。

Ps.I猜想你也可以用Composite Commands and have almost the same result. The difference between each other you can check here.

编辑:我已经在您的代码中实现了它并发送了一个 PR...