以编程方式从 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。
流程可能是这样的:
- 结果准备就绪后,您可以发布事件并将结果作为该事件的负载发送。
- 在结果视图模型中订阅该事件以设置应显示的所有数据。
- 在作为 tabcontrol 的数据控件的视图模型中订阅相同的事件,在处理程序中,您可以将 "IsResultsSelected" 之类的布尔值设置为 true。
因此,您可以同时做两件事,发送数据和 select 选项卡。
Ps.I猜想你也可以用Composite Commands and have almost the same result. The difference between each other you can check here.
编辑:我已经在您的代码中实现了它并发送了一个 PR...
主要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。
流程可能是这样的:
- 结果准备就绪后,您可以发布事件并将结果作为该事件的负载发送。
- 在结果视图模型中订阅该事件以设置应显示的所有数据。
- 在作为 tabcontrol 的数据控件的视图模型中订阅相同的事件,在处理程序中,您可以将 "IsResultsSelected" 之类的布尔值设置为 true。
因此,您可以同时做两件事,发送数据和 select 选项卡。
Ps.I猜想你也可以用Composite Commands and have almost the same result. The difference between each other you can check here.
编辑:我已经在您的代码中实现了它并发送了一个 PR...