2011-01-28 3 views
1

Новое в WPF, я пытаюсь сделать что-то основное (я думаю!). У меня есть TabControl и ListBox, который показывает, что tabitems открыты:WPF Binding 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 - приветственная вкладка, и я не хочу, чтобы она отображалась в списке.

UPDATE:

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

+0

Я бы сделал это с ViewModel и двумя разными свойствами. Другой способ - установить Visibility = Collapsed внутри ListBoxItem ControlTemplate на определенных условиях с помощью DataTrigger. Но это решение не кажется хорошим. – vorrtex

ответ

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 
} 
+0

большое спасибо всем, кто ответил. я сделаю небольшое исследование о том, как реализовать IValueConverter. наилучшие пожелания! –

+0

только что вернулся к этому проекту и задался вопросом, можете ли вы опубликовать код для ivalueconverter? я пытался найти некоторые образцы онлайн, которые связаны с tabitem или заголовками таблиц и не имеют большой удачи. большое спасибо! –

+0

@ Easton Ronaldo Если вы понимаете, как работает IValueConverter; то это довольно просто. Код для фильтрации высмеивается уже для вас. Просмотрите различные ссылки в моем ответе, и я уверен, что это будет иметь больше смысла. –

0

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

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

0

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

0

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

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