WPF Binding ListBox и TabItems - PullRequest
       7

WPF Binding ListBox и TabItems

1 голос
/ 28 января 2011

Новичок в WPF, я пытаюсь сделать что-то простое (я думаю!). У меня есть TabControl и ListBox, который показывает, какие табеметы открыты:

<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>

Возможно ли связать определенные табитемы (tabitem2 и tabitem3), а не весь tabcontrol? Причина в том, что tabitem1 является первой вкладкой приветствия, и я не хочу, чтобы она отображалась в списке.

UPDATE:

Будет ли кто-нибудь так любезно опубликовать некоторый код о том, как использовать IValueConverter для скрытия / фильтрации табита? Я искал часы без удачи. Большое спасибо!

Ответы [ 4 ]

1 голос
/ 28 января 2011

В вашей текущей настройке единственным способом было бы запустить его через 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
}
0 голосов
/ 28 января 2011

Вы можете добавить конвертер в ItemSource, а затем в конвертере удалить страницу приветствия или внести любые необходимые изменения.

0 голосов
/ 28 января 2011

Я рекомендую не делать этого.Вместо этого используйте общий источник данных с Listbox и Tabcontrol.

Чтобы отфильтровать / перехватить любую привязку данных, вы можете использовать IValueConverter.

0 голосов
/ 28 января 2011

Вам потребуется отфильтровать вкладку приветствия, поэтому вам нужно будет добавить фильтр в CollectionView Вместо привязки к элементам элемента управления вкладки, которые вы привязываете к представлению коллекции.

Хотя ValueConverter может работать, я считаю это своего рода хаком.

...