【问题标题】:Navigation from Tab Item to another Tab item from a ViewModel programmatically以编程方式从 ViewModel 中的选项卡项导航到另一个选项卡项
【发布时间】:2019-11-16 17:53:23
【问题描述】:

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

感谢任何帮助和建议

【问题讨论】:

  • 这就是为什么像 prism 这样的框架提供像 EventAggregator 这样的元素。您从一个 ViewModel 中抛出一个事件并从另一个 ViewModel 中监听它,并在该事件触发时采取行动。如果您不想使用 MVVM 框架,您可以实现自己的。创建一个单例类,它定义了一个从 EntryViewModel 触发的事件,并在 MainWindow(或其视图模型)中监听它,然后更改活动选项卡。
  • 当按钮被点击时,它应该在 ViewModel 中设置一个属性。选项卡选择应该订阅 ViewModel 的属性并相应地显示自己。始终以编程方式与您的 ViewModel 交互。不要以编程方式与 UI 交互。
  • 为什么不能使用TabControl.SelectedIndex
  • 谢谢大家的回复,很有帮助

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


【解决方案1】:

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

Event Aggregator

流程可能是这样的:

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

因此,您将能够同时做两件事,发送数据并选择选项卡。

Ps.我猜你也可以使用Composite Commands 并且得到几乎相同的结果。相互之间的区别可以查看here

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 2013-02-27
    • 2017-01-15
    • 2020-12-13
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多