我有一个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}
。我无法弄清楚如何获取此对象并获取列表框控件本身。有什么建议吗?
答案 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