2015-03-12 2 views
0

У меня есть коллекция из нескольких тысяч элементов, и я хочу отобразить только их подмножество. Есть ли способ привязать коллекцию к представлению таким образом, что только определенные элементы, например. отображаются те, у которых есть свойство «Показать == истина»? Если это так, будет ли он создавать тысячи элементов пользовательского интерфейса? Или мне нужно создать новый список отображаемых элементов?Частично привязка к списку

+1

вместо привязки к коллекции создания [ 'ListCollectionView'] (https://msdn.microsoft.com/en-us/library/system.windows.data. listcollectionview (v = vs.110) .aspx), установите 'Filter' и привяжите к этому – dkozl

ответ

1

Проверить CollectionViewSource Class и CollectionViewSource.Filter Event

View (частичный пример):

<Grid> 
    <Grid.DataContext> 
     <wpfCalc:StudentList/> 
    </Grid.DataContext> 

    <Grid.Resources> 
     <CollectionViewSource 
      Source="{Binding Students,Mode=OneWay}" x:Key="StudentsCollViewSource" 
      Filter="StudentsCollViewSource_OnFilter"/> 
    </Grid.Resources> 

    <ListBox ItemsSource="{Binding Source={StaticResource StudentsCollViewSource}}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name,Mode=OneTime}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

И код позади реализации фильтра:

private void StudentsCollViewSource_OnFilter(object sender, FilterEventArgs e) 
{ 
    var s = e.Item as Student; 
    e.Accepted = s != null && !string.IsNullOrWhiteSpace(s.Name); 
} 
1

Существует два метода. Первый заключается в использовании конвертера.

<Window.Resources> 
      <local:BoolToVisibilityConverter x:Key="converter"/> 
     </Window.Resources> 
     <StackPanel> 
      <ListView x:Name="listView" ItemsSource="{Binding List}"> 
       <ListView.ItemTemplate> 
        <DataTemplate > 
         <TextBlock Text="{Binding Name}" Visibility="{Binding IsActive, Converter={StaticResource converter}}"/> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </StackPanel> 

// Код За

public class BoolToVisibilityConverter : IValueConverter 
    { 
     #region IValueConverter Members 

     public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return (bool)value ? Visibility.Visible : Visibility.Collapsed; 
     } 

     public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return false; // not needed 
     } 

     #endregion 
    } 

Второй метод заключается в использовании Linq

List<MyData> list 
    { 
     get 
     { 
      if(list!=null) 
      return list.where(p => p.IsActive == true); 
      return null; 
     } 
     set 
     { 
      if(list!=value) 
      list = value; 
     } 
    } 
Смежные вопросы