【问题标题】:How to find the current/active Tab in Josh Smith's MVVM Demo App如何在 Josh Smith 的 MVVM 演示应用程序中找到当前/活动选项卡
【发布时间】:2015-03-18 03:47:31
【问题描述】:

我一直在调整 Josh Smith's MVVM Demo app 以满足我的要求。

我大部分时间都取得了成功。现在我想在此应用程序的文件菜单项中添加一个功能“打印”(类似于任何应用程序中存在的打印功能)。由于我可以在此应用程序中打开多个选项卡,当用户单击“打印”时,我如何知道哪个选项卡(更具体地说是哪个工作区)处于活动状态?下面的代码显示了在 DemoApp 中使用 TabControl 的 DataTemplate。

非常感谢任何帮助/想法。

<DataTemplate x:Key="WorkspacesTemplate">
<TabControl 
  IsSynchronizedWithCurrentItem="True" 
  ItemsSource="{Binding}" 
  ItemTemplate="{StaticResource ClosableTabItemTemplate}"
  Margin="4"
  />

【问题讨论】:

  • @devhedgehog :不,这不是 MVVM 中的工作方式。 MVVM 没有隐藏代码,您建议的 stakoverflow 链接适用于一般 WPF 解决方案。
  • 你在哪里读到的? model-VIEW-ViewModel 模式确实允许我朋友后面的代码是 VIEW 的一部分。此外,如果您正确检查该链接,用户将 TabControl.SelectedItem 绑定到 ViewModel 中的属性。那里根本没有代码:)
  • SelectedIndex 对您和 SelectedItem 都不起作用?那么你的 ViewModel 需要改进。请发布更多代码
  • 运行您的代码并检查输出窗口。我认为您会偶然发现一些绑定错误

标签: c# wpf mvvm tabcontrol


【解决方案1】:

首先你的 DataContext 是错误的,你的 DataContext 应该是一个 ViewModel,你将 ItemsSource 绑定到 ObservableCollection 属性。例如

<TabControl 
  IsSynchronizedWithCurrentItem="True" 
  ItemsSource="{Binding Tabs}" 
  SelectedItem={Binding SelectedTab}
  ItemTemplate="{StaticResource ClosableTabItemTemplate}"
  Margin="4"
  />

你在哪里

public class MainViewModel 
{
    public ObservableCollection<TabViewModel> Tabs { get; set; }
    public TabViewModel SelectedTab { get; set; }
}

在你的窗口代码后面,你应该在构造函数中拥有的是

public MainView()
{
    this.DataContext = new MainViewModel()
}

public MainView(MainViewModel vm)
{
    this.DataContext = vm;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多