WPF绑定ListBox和TabItems

时间:2011-01-28 20:09:05

标签: c# wpf binding tabitem

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的代码?我一直在寻找没有运气的时间。非常感谢!

4 个答案:

答案 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。