【问题标题】:Get the DataTemplate Object of an ItemsSource获取 ItemsSource 的 DataTemplate 对象
【发布时间】:2017-07-24 13:44:53
【问题描述】:

我有一个 TabControl,它看起来像这样:

<TabControl x:Name="TabControl" SelectedIndex="0" ItemsSource="{Binding Diagrams}" SelectionChanged="TabControl_OnSelectionChanged">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="Test">
                </TextBlock>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <drawingBoard:DrawingBoard x:Name="TheDrawingBoard" DockPanel.Dock="Top" Focusable="True"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

我之前扩展的代码无法创建动态选项卡,需要DrawingBoard 的对象来做一些事情。由于我使用 ItemsSource,我只在 SelectionChanged 事件中获得了一个 Diagrams 对象。如何获取我当前选择的选项卡的ContentTemplate.DataTemplate 对象(绘图板)?

【问题讨论】:

  • 你想从哪里得到它?
  • 我在视图的代码隐藏中需要它。在 SelectionChanged 事件中更具体

标签: c# wpf mvvm tabcontrol


【解决方案1】:

您必须遍历 VisualTree。该类型只有一个子元素,即来自当前标签。

private void TabControl_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if ((sender as TabControl)!=null)
            {
                var yourCtl = GetChildren<DrawingBoard>((sender as TabControl)).FirstOrDefault() as DrawingBoard;
            }
        }

        IEnumerable<T> GetChildren<T>(FrameworkElement parent) where T : FrameworkElement
        {
            var chCount = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < chCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                if (child is T)
                {   
                    yield return child as T;
                }
                if (child is FrameworkElement)
                {
                    foreach (var item in GetChildren<T>(child as FrameworkElement))
                    {
                        yield return item;
                    };
                }
            }
        }

【讨论】:

    【解决方案2】:

    找到了解决我的问题的方法。解决方案由 WPF 博士提供。

    private void TabControl_OnLoaded(object sender, RoutedEventArgs e)
        {
            TabControl tabControl = sender as TabControl;
            ContentPresenter cp =
                tabControl.Template.FindName("PART_SelectedContentHost", tabControl) as ContentPresenter;
    
            var db = tabControl.ContentTemplate.FindName("TheDrawingBoard", cp) as DrawingBoard;
            CurrentlySelectedDrawingBoard = db;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2016-06-07
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多