WPF的新手,我正在尝试做一些基本的事情(我想!)。我有一个TabControl和一个ListBox,显示哪些tabitems是打开的:
<ListBox Width="170" Height="188" ItemsSource="{Binding Items, ElementName=tabControl}" Name="ListTabs" Canvas.Left="0" Canvas.Top="27">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
El
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
是否可以绑定到特定的tabitems(tabitem2和tabitem3)而不是整个tabcontrol?原因是第一个tabitem1是一个欢迎选项卡,我不希望它显示在列表框中。
更新
有人会如此友善地发布一些关于如何使用IValueConverter隐藏/过滤tabitem的代码?我一直在寻找没有运气的时间。非常感谢!
答案 0 :(得分:1)
在您当前的设置中,唯一的方法是通过IValueConverter运行它。
<Window.Resources>
<converters:StripOutFirstTabConverter x:Key="StripOutFirstTabConverter"/>
</Window.Resources>
<ListBox Width="170" Height="188" ItemsSource="{Binding Items, ElementName=tabControl, Converter={StaticResource StripOutFirstTabConverter}}" Name="ListTabs" Canvas.Left="0" Canvas.Top="27">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
El
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
如果您愿意修改方法,可以将ListBox.ItemsSource
绑定到ICollectionView,然后使用Filter
属性。
public ICollectionView Tabs
{
get
{
if (_view == null)
{
_view = CollectionViewSource.GetDefaultView(tabControl.Items);
_view.Filter = Filter;
}
return _view;
}
}
private bool Filter(object arg)
{
//arg will be a TabItem, return true if you want it, false if you don't
}
答案 1 :(得分:0)
您必须过滤掉欢迎标签,因此您需要在CollectionView上添加过滤器,而不是绑定到您要绑定到集合视图的标签控件的项目。
虽然ValueConverter可能有用,但我认为这是一种黑客行为。
答案 2 :(得分:0)
您可以将转换器添加到ItemSource,然后在转换器中删除欢迎页面或进行所需的任何更改。
答案 3 :(得分:0)
我建议不要这样做。使用公共数据源代替Listbox和Tabcontrol。
要过滤/拦截任何数据绑定,您可以使用IValueConverter。