【发布时间】: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