【问题标题】:How to iterate tabs and list boxes within them如何在其中迭代选项卡和列表框
【发布时间】:2014-10-08 17:12:54
【问题描述】:

我有一个 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}。我不知道如何获取这个对象并获取列表框控件本身。有什么建议吗?

【问题讨论】:

  • 我建议你开始阅读here
  • 我似乎找不到我要找的东西。我不想绑定任何属性,我只是想要一种方法来关联它们,以便在应用程序级别我可以根据我拥有的选项卡引用列表框。
  • @HighCore 的建议暗示您应该关注 MVVM。这样做——这是 WPF 应用程序的正确模型——将允许您获得所有测试,并使用一个 LINQ 语句运行它们。
  • @NETscape 谢谢。我在 SO 中一遍又一遍地重复了这一点,我根本不想再说下去了。
  • @McAdam331 不,你做了所有的工作,我只是为你指出了正确的方向:)

标签: c# wpf tabs


【解决方案1】:

尝试在创建 ListBox 时将 ListBox 添加到预期 TabControl 对象的 Tag 属性。

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

【讨论】:

    【解决方案2】:

    您可以使用简单的 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; }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      var loginListBox = tabLoginTests.DataContext as ListBox
      

      【讨论】:

        猜你喜欢
        • 2011-09-10
        • 2019-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-13
        • 2020-10-23
        • 2021-01-14
        相关资源
        最近更新 更多