如何在其中迭代选项卡和列表框

时间:2014-10-08 17:12:54

标签: c# wpf tabs

我有一个WPF应用程序,用于选择稍后作为自动测试应用程序的一部分运行的测试。

在UI中,我有多个选项卡控件,代表每个测试类别。每个选项卡内部都是每个测试的复选框列表框。

当用户选择所有测试并单击运行按钮时,我需要遍历每个选项卡及其中的列表框以构建最终测试列表。我不希望有大量的陈述:

GetTab1Tests();
GetTab2Tests();
GetTab3Tests();
// Continue

我想以我能说的方式设计这个:

foreach(Tab t in tabControl)
{
    CollectTestsFromListbox(**listbox associated with t**);
}

如何绑定此信息?我最好的猜测是创建一个字典,将标签与必要的列表框配对,但这是一个好的做法向前推进吗?随着正在测试的应用程序的增长,对更多选项卡的需求也会增长。

修改 目前我已尝试设置选项卡的DataContext:

<TabItem x:name="tabLoginTests DataContext="{Binding ElementName=lstboxLoginTests}">

在.xaml.cs文件中我可以调用:

tabLoginTests.DataContext

所有这一切都是返回{System.Windows.Controls.ListBox Items.Count:4}。我无法弄清楚如何获取此对象并获取列表框控件本身。有什么建议吗?

3 个答案:

答案 0 :(得分:0)

在创建ListBox时,尝试将ListBox添加到目标TabControl对象的Tag属性中。

然后您可以使用t.Tag访问它。然后,您可以将其强制转换为ListBox(.Tag是一个对象)。

答案 1 :(得分:0)

您可以使用简单的ItemsControl绑定模型。

要访问选定的测试,只需使用Groups属性迭代列表。

public IEnumerable<Test> GetSelectedTests()
{
    return Groups.SelectMany(x => x.Tabs).SelectMany(x => x.Tests).Where(x => x.IsEnabled);
}

MainWindow.xaml

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="600" Width="640">
<Grid>
    <ItemsControl ItemsSource="{Binding Groups}" HorizontalAlignment="Center">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel></WrapPanel>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}" Margin="4"/>
                    <TabControl Width="300" MinHeight="250" Margin="4" ItemsSource="{Binding Tabs}">
                        <TabControl.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Name}"/>
                            </DataTemplate>
                        </TabControl.ItemTemplate>
                        <TabControl.ContentTemplate>
                            <DataTemplate>
                                <ListBox ItemsSource="{Binding Tests}">
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <CheckBox Content="{Binding Name}" IsChecked="{Binding IsEnabled}"/>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>
                            </DataTemplate>
                        </TabControl.ContentTemplate>
                    </TabControl>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication3
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<Group> Groups { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            Groups = new ObservableCollection<Group>();
            Groups.Add(new Group()
            {
                Name = "Group1",
                Tabs = new ObservableCollection<Tab>()
                {
                    new Tab()
                    {
                        Name = "Tab11",
                        Tests = new ObservableCollection<Test>()
                        {
                            new Test() { Name = "Test111", IsEnabled = true },
                            new Test() { Name = "Test112", IsEnabled = false }
                        }
                    },
                    new Tab()
                    {
                        Name = "Tab12",
                        Tests = new ObservableCollection<Test>()
                        {
                            new Test() { Name = "Test121", IsEnabled = true },
                            new Test() { Name = "Test122", IsEnabled = false },
                            new Test() { Name = "Test123", IsEnabled = false }
                        }
                    }
                }
            });

            Groups.Add(new Group()
            {
                Name = "Group2",
                Tabs = new ObservableCollection<Tab>()
                {
                    new Tab()
                    {
                        Name = "Tab21",
                        Tests = new ObservableCollection<Test>()
                        {
                            new Test() { Name = "Test211", IsEnabled = true },
                            new Test() { Name = "Test212", IsEnabled = false },
                            new Test() { Name = "Test213", IsEnabled = true }

                        }
                    },
                    new Tab()
                    {
                        Name = "Tab22",
                        Tests = new ObservableCollection<Test>()
                        {
                            new Test() { Name = "Test221", IsEnabled = true },
                            new Test() { Name = "Test222", IsEnabled = false },
                            new Test() { Name = "Test223", IsEnabled = false }
                        }
                    }
                }
            });

            DataContext = this;
        }
    }

    public class Group
    {
        public string Name { get; set; }
        public IList<Tab> Tabs { get; set; }
    }

    public class Tab
    {
        public string Name { get; set; }
        public IList<Test> Tests { get; set; }
    }

    public class Test
    {
        public string Name { get; set; }
        public bool IsEnabled { get; set; }
    }
}

答案 2 :(得分:-1)

我能够使用的解决方案仍然涉及使用数据上下文。起初,我无法隐式地将对象转换为列表框,但最终意识到可以使用as

var loginListBox = tabLoginTests.DataContext as ListBox