2015-12-18 3 views
2

Приложение WPF использует ListBox для отображения сообщений трассировки различных групп.Показать/скрыть ListBox Элементы действия пользователя

<ListBox ItemsSource="{Binding ElementName=UI, Path=List}" x:Name="listBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid Name="grid1" > 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="70" /> 
        <ColumnDefinition Width="140" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Grid.Background> 
        <SolidColorBrush Color="{Binding Path=Color}"/> 
       </Grid.Background> 
       <TextBlock Grid.Column="0" Text="{Binding Path=ItemId}"/> 
       <TextBlock Grid.Column="1" Text="{Binding Path=Timestamp}"/> 
       <TextBlock Grid.Column="2" Text="{Binding Path=Message}"/> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Здесь приведено определение элементов в соответствующем ObservableCollection.

Теперь я хочу дать пользователю возможность выбрать одну или несколько групп, которые будут показаны или скрыты во время выполнения. Я не хочу просто удалять элементы группы из ObservableCollection, чтобы снова показать их позже.

Возможно ли это каким-то образом управлять XAML?

Edit1: Основываясь на подсказке от я Enhanced "MyModel" HiMa_D3ViL с Видимость собственности и модифицированном мой XAML в

<ListBox ItemsSource="{Binding ElementName=UI, Path=List}" x:Name="listBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid Name="grid1" Visibility="{Binding Path=Visibility}"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="70" /> 
        <ColumnDefinition Width="140" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Grid.Background> 
        <SolidColorBrush Color="{Binding Path=Color}"/> 
       </Grid.Background> 
       <TextBlock Grid.Column="0" Text="{Binding Path=ItemId}"/> 
       <TextBlock Grid.Column="1" Text="{Binding Path=Timestamp}"/> 
       <TextBlock Grid.Column="2" Text="{Binding Path=Message}"/> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Это частично работает. Значение связанной записи будет скрыто, но в ListBox останется пустое пространство. Смотрите здесь:

enter image description here

+0

Попробуйте использовать CollectionViewSource, который предоставляет возможность фильтровать (через предикат) данные привязки при условии условии. – user1672994

ответ

1

В зависимости от размера вашей коллекции и сколько раз он получает доступ, вы могли бы провести эту логику в отдельном добытчике собственности, который используется в качестве связующего источника ТОЛЬКО

public Interface IHidable 
{ 
    bool hidden; 
} 

public class MyModel : IHidable , ... 
{ 

} 

private Collection<MyModel> realCoollection; //use this for anything else 
public Collection<IHidable > viewCollection //Bind this in your WPF 
{ 
    get { 
    Collection<IHidable> resCollection = new Collection<IHidable>(); 
    foreach (MyModel item in realCoollection) 
    {    
     if (!item.hidden) res.Add((IHidable)item) 
    } 
    return resCollection; 
    } 
} 
+0

Спасибо за ваш ответ. Коллекции могут стать действительно большими, поэтому я предполагаю, что это может быть не лучшее решение (с точки зрения производительности и потребления памяти) – thowa

+0

Я уже некоторое время использую эти свойства, чтобы провести ряд различных украшений, в зависимости от того, какой контроль моя коллекция обязана. Это решение на самом деле намного меньше памяти и производительности голодных, чем может показаться, поскольку оно содержит только ссылки на ваши объекты, и создание такого списка очень дешево по сравнению с тем, что WPF делает в фоновом режиме в любом случае. Также количество раз, когда доступ к получателям доступно, на самом деле не так высок. ... Но я не знаю, насколько велика ваша коллекция. – srandppl

+0

Моя коллекция может содержать миллионы строк легко – thowa

0

Создайте свойство типа Видимость в вашем классе модели и писать стиль для ListBoxItem, таких как:

<Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem"> 
     <Setter Property="Visibility" Value="{Binding Path=YourVisibilityProperty}"/> 
<Style/> 

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

+0

Это не сработало для меня. Но изменение моего XAMl на '' приводит к пустым строкам в ListBox. – thowa

+0

да, я получил ваш вопрос, если вы делаете это с помощью ListBoxItemStyle, чем только он работает идеально, как вы хотите, и это отлично работает для меня, тем не менее у вас есть проблема, чем вы отправите мне больше деталей кода. –

+1

Ваша проблема также может быть решена с помощью триггера, например:

Смежные вопросы