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

时间:2019-11-16 17:53:23

标签: c# wpf .net-core-3.0

主窗口Xaml

<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 我在主窗口中有一个TabControl,还有2个选项卡项。

我想做的是单击EntryForm上的Measure Distance按钮,并且EntryFormViewModel中的命令完成了为结果视图准备数据的过程。我想以编程方式使DistanceResults TabItem处于活动状态,并将需要显示的数据传递给它。

这是针对WPF距离测量应用程序的,该应用程序是开源的,并且正在我的Twitch流中进行开发,但是我无法找到一种方法来完成上述操作。该项目在这里

https://github.com/copperbeardy/GPSDistanceMeasure

感谢您的任何帮助和建议

1 个答案:

答案 0 :(得分:0)

我认为您可以将Tabitem的IsSelected属性绑定到一个布尔值上,以强制执行该选择,但是,应该在整个tabcontrol的数据上下文视图模型中完成此操作,并且还应利用从事件棱镜到事件聚合器的优势。将数据发送到另一个VM。

Event Aggregator

流可能是这样的:

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

因此,您将能够一次完成两件事,发送数据并选择标签。

Ps。我想您也可以使用Composite Commands并获得几乎相同的结果。您可以检查here之间的区别。

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