2015-04-28 1 views
0

У меня проблема с моим ListView. Я привязываю ItemsSource к моему ViewModel, но хочу, чтобы объекты, у которых определенное свойство установлено равным null, были полностью свернуты (как и во всем элементе, свернуто, а не только элемент управления, который привязан к свойству, которое может быть null). У меня есть конвертер, который работает, но ListView по-прежнему, по-видимому, резервирует по крайней мере некоторое пространство для элементов, которые рухнули. Это приводит к тому, что мой ListView имеет уродливые «дыры». (Обратите внимание, что отверстия не занимают столько места, сколько видимых предметов, но они занимают некоторое пространство, а «невидимые» предметы даже можно щелкнуть ...)Не показывать элементы с видимостью = Свернуто в Windows Phone 8.1 ListView

Моя проблема почти такая же, как у один из приведенных здесь: Not showing items with Visibility=Collapsed in Windows 8.1 GridView

Единственное, что меня беспокоит, это то, что OP связанного вопроса говорит, что для него он отлично работает в Windows Phone, но не в Windows. Ну, для меня это не работает в Windows Phone. Какие-нибудь предложения, что я мог сделать?

Кодекс:

<DataTemplate x:Key="UpcomingEpisodesTemplate"> 
     <Grid Visibility="{Binding Upcoming, Converter={StaticResource EpisodeVisibilityConverter}}"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="110"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      ....The rest of the template which is not important... 
     </Grid> 
    </DataTemplate> 

Спасибо!

ответ

0

Вы можете попробовать преобразовать все, что связано с ItemsSource. Пример:

<ListView 
    ItemsSource={Binding MyList, Converter={StaticResource MyListConverter}}> 

С конвертером, таким образом.

public class MyListConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return ((IEnumerable<MyType>)value).Where(x => x.MyProperty != null); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return null; 
    } 
} 

Редактировать с ObservableCollection.

public class MyListConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     var originalObservable = (ObservableCollection<MyType>)value; 

     var collection = new ObservableCollection<MyType>(); 

     collection.AddRange(originalObservable.Where(x => x.MyProperty != null)); 

     originalObservable.CollectionChanged += delegate { collection.Clear(); collection.AddRange(originalObservable.Where(x => x.MyProperty != null)); }; 

     return collection; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return null; 
    } 
} 
+0

Какой аккуратный маленький трюк, не думал об этом ... Спасибо большое! Единственная проблема, с которой я сталкиваюсь с этим решением/обходным решением, заключается в том, что конвертер не будет вызываться, если фактический ObservableCollection (связанный с ListView) будет каким-либо образом изменен (т. Е. Элемент добавлен/удален и т. Д.). Я написал метод, который устанавливает ItemSource в значение null, а затем в ObservableCollection, чтобы принудительно вызвать конвертер. – Neuromancer

+0

Нравится программа? Поделись с друзьями! Любая идея, как я могу достичь такого же поведения, но в «чистом» виде? – Neuromancer

+0

Ну, вы можете вернуть новый ObservableCollection в конвертер и посмотреть оригинальную коллекцию (хранящуюся в «value») для изменений в CollectionChanged и обновить возвращенную коллекцию. –

1

Я искал в течение 2 дней, чтобы свернуть детали без оставшегося держателя места от стиля контейнера, и это, кажется, работает (WinRT 8,1).

(Key_Up Event from TextBox) 

foreach (YourType element in TheListViewZoomedIn.Items) 
{ 
    if (!element.YourProperty.Contains(ListSearchBox.Text)) 
     (TheListViewZoomedIn.ContainerFromItem(element) as ListViewItem).Visibility = Visibility.Collapsed; 
} 

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

Я просто хотел поделиться этим - это мог бы помочь другим в будущем,

наилучших пожеланий, Стефан

0

В случае, если это помогает, вы можете решить эту проблему с дополнительными пробелами рухнувшего ListViewItems по изменение ItemContainerStyle к пользовательскому стилю (изменить копию стиля по умолчанию) и изменения: -

<Setter Property="MinWidth" Value="{ThemeResource ListViewItemMinWidth}"/> 
<Setter Property="MinHeight" Value="{ThemeResource ListViewItemMinHeight}"/> 

для

<Setter Property="MinWidth" Value="0"/> 
<Setter Property="MinHeight" Value="0"/> 
Смежные вопросы