将 TabControl ItemsSource 绑定到 ViewModel 集合

2023-11-21

由于某种原因,我很难得到我的TabControl绑定时正确显示ItemsSource to a ObservableCollection视图模型。我的设计基于此处找到的教程:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。我确实在这里发现了一些像我这样的问题,但没有一个问题解决了我的特殊情况。 这是我的TabControl在 xaml 中。

<TabControl ItemsSource="{Binding Workspaces}"
            SelectedIndex="{Binding ActiveWorkspaceIndex}"
            ItemTemplate="{StaticResource ClosableTabItemTemplate}"/>

Where ClosableTabItemTemplate如下。

<DataTemplate x:Key="ClosableTabItemTemplate">
        <DockPanel Width="120">
          <Button 
              Command="{Binding Path=CloseCommand}"
              Content="X"
              Cursor="Hand"
              DockPanel.Dock="Right"
              Focusable="False"
              FontFamily="Courier" 
              FontSize="9"
              FontWeight="Bold"  
              Margin="0,1,0,0"
              Padding="0"
              VerticalContentAlignment="Bottom"
              Width="16" Height="16" 
              />
          <ContentPresenter 
              Content="{Binding Path=DisplayName}" 
              VerticalAlignment="Center" 
              />
        </DockPanel>
      </DataTemplate>

Workspaces is the ObservableCollection视图模型。ActiveWorkspaceIndex只是我在视图模型中跟踪的活动工作区索引。我通过 App.xaml 文件中的以下数据模板将视图模型与视图实例关联起来。

<DataTemplate DataType="{x:Type vm:ViewModelStartPage}">
     <v:ViewStartPage/>
 </DataTemplate>

我只向我的工作区集合添加一个视图模型。我看到选项卡控件中显示了 2 个视图,但它们没有选项卡式。这几乎就像 TabControl 不知道将不同的视图视为 TabItems,它的行为更像是堆栈面板,堆叠视图。如果我在代码中创建选项卡项,它可以正常工作,如下所示:

System.Windows.Controls.TabItem i = new System.Windows.Controls.TabItem();
i.Content = new Views.ViewStartPage();
i.Header = "A Tab Item";
this.xTabControl.Items.Add(i); 

我一定是缺少一些内容模板之类的。稍后我将设计我的选项卡,但现在我很高兴能够让基本选项卡正常工作。此外,每个选项卡的选项卡内容中的视图可能有所不同,因此我无法使用随处可见的简单文本块 TabControl 模板示例... IE。不是这个...

<TabControl.ContentTemplate>
    <DataTemplate>
        <TextBlock
           Text="{Binding Content}" />
    </DataTemplate>

有任何想法吗?


我最终使用了ContentControl with a TabControl数据模板(如原始教程项目)。这是我最终得到的 xaml 代码。我没有更改原始示例项目的代码隐藏来完成这项工作。这ContentControl位于我的 MainWindow.xaml 中,另外两段代码位于ResourceDictionary.

<!-- Workspaces Tab Control -->
      <ContentControl Grid.Row="1"
                      VerticalAlignment="Stretch"
                      HorizontalAlignment="Stretch"
                      Content="{Binding Path=Workspaces}"
                      ContentTemplate="{StaticResource WorkspacesTemplate}"/>

<!-- Workspaces Template -->
  <DataTemplate x:Key="WorkspacesTemplate">
    <TabControl Style="{StaticResource ClosableTabControl}"
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding}"
                ItemTemplate="{StaticResource WorkspaceTabItemTemplate}"
                Margin="1"/>
  </DataTemplate>


<!-- Workspace Tab Item Template -->
  <DataTemplate x:Key="WorkspaceTabItemTemplate">
    <Grid Width="Auto" Height="Auto">
      <ContentPresenter ContentSource="Header" Margin="3" 
                        Content="{Binding Path=DisplayName}"
                        HorizontalAlignment="Center" VerticalAlignment="Center">
        <ContentPresenter.Resources>
          <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="{StaticResource Foreground}"/>
          </Style>
        </ContentPresenter.Resources>
      </ContentPresenter>
    </Grid>
  </DataTemplate>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 TabControl ItemsSource 绑定到 ViewModel 集合 的相关文章

  • WPF 处理文本、图像和文件粘贴事件

    我正在开发一个 WPF 应用程序 我想捕获 RichTextBox 输入中的粘贴命令并处理粘贴的文件 为此 我使用以下回调
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • WPF 绑定 CompositeCollection 中的 MenuItem 不起作用

    我在将命令绑定到复合集合中的菜单项时遇到问题 这MenuItem是其一部分ContextMenu这是定义在UserControl Resources 问题是新标签的绑定不起作用 当我将 MenuItem 放置在复合集合之外时 它将起作用 有
  • 如何在 WinRT XAML Toolkit 折线图中设置轴边距?

    Answer 最后我用这个解决了我的答案 LineSeries MyChart Series 0 IndependentAxis new LinearAxis Minimum 1 Maximum 5 Orientation AxisOrie
  • WPF控件默认大小

    为 wpf 应用程序定义自定义资源主题时 我可以设置宽度 高度等 如何找到这些属性的默认值 即框架中提供的控件中使用的值 WPF 控件通常不包含任何类型的默认大小 WPF 的主要功能点之一是 除非您指定大小 否则所有内容都会动态调整大小 如
  • 如何在 WPF 应用程序上执行异步启动?

    我在异步等待方面相当落后 所以这可能是一个 duh 问题 我正在开发一个非常小的 UI 应用程序 它使用以下命令从系统托盘运行WPF 通知图标 http www codeproject com Articles 36468 WPF Noti
  • 如何以编程方式调用应用程序菜单?

    我有自定义样式的非矩形透明窗口
  • 使用资源定义厚度

    在 Windows UWP 应用程序项目中 我尝试通过分配给其厚度来定义厚度Left Top Right and Bottom特性
  • WPF:通过拖放重新排序 WrapPanel 内容?

    我正在寻找一种通过拖放对 WPF WrapPanel 的内容 项目 重新排序的方法 我只想单击一个项目并将其拖动到新位置 据我了解 这是一项非常常见的任务 我想知道有人已经这样做了 或者知道如何实现此功能 我已经进行了谷歌搜索 但什么也没找
  • 解释 System.Diagnostics.CodeAnalysis.SuppressMessage

    我在某些应用程序中有这种代码 来自微软 assembly System Diagnostics CodeAnalysis SuppressMessage Microsoft Naming CA1702 CompoundWordsShould
  • 列表框未使用绑定填充

    我正在尝试使用 mvvm 模式将现有程序转换为 c wpf 第一部分是选择要处理的文件的文件夹位置并填充列表框 我在这里找到了一个使用 Mvvm Light 的示例 WPF OpenFileDialog 与 MVVM 模式 https st
  • 当 AutoGenerateColumns = True 时如何重命名 DataGrid 列?

    我有一个简单的数据结构类 public class Client public String name set get public String claim number set get 我正在将其喂入DataGrid this data
  • 如何使取消按钮像“X”按钮一样工作?

    在我的 XAML 文件中 我有一个窗口 我试图将其设置为无论用户单击 X 按钮还是单击 取消 按钮 行为都是相同的 我的缩写代码如下 public partial class Dialog Window private void Windo
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 如何访问 TabControl 选项卡内的控件?

    这就是我到目前为止所拥有的一切 tabControl1 TabPages 0 我的 TabControl 的 TabPage1 中有一个 PictureBox 如何使用代码而不是属性窗格更改图像位置 尽管控件出现在容器内 作为 TabCon
  • 用于打印的真实尺寸 WPF 控件

    我目前正在开发一个应用程序 用户可以在画布上动态创建 移动 TextBlock 一旦他们将文本块放置在他们想要的位置 他们就可以按下打印按钮 这将导致 ZPL 打印机打印当前显示在屏幕上的内容 ZPL 命令是通过从每个 TextBlock
  • Azure 可以运行 WPF 吗?

    我想编写一个在 Windows Azure 上运行的 ASP Net MVC 应用程序 该应用程序将使用 WPF 创建图像 在我开始写之前 这会起作用吗 Azure 是否具有渲染 WPF 所需的 DLL 包括 DirectX 和图形功能 我
  • 为 WPF DataGrid 行一一着色

    我正在制作一个 WPF 程序 它能够为 a 中的行着色DataGrid一个接一个地使用红色for循环 我遇到了一些奇怪的事情 如果DataGrid数据库表中有 40 多行数据 它不会对所有行进行着色 这是我正在使用的代码 private v
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 如何将 ValueConverter 应用于基于约定的 Caliburn.Micro 绑定?

    如何将 ValueConverter 应用于基于约定的 Caliburn Micro 绑定 或者您需要使用 Binding 语法吗 我知道我可以做到这一点

随机推荐