部分绑定到列表

时间:2015-03-12 16:37:30

标签: wpf

我有几千个元素的集合,我想只显示它们的一个子集。有没有办法将集合绑定到视图,以便只有某些元素,例如显示属性“Show == true”的那些?如果是这样,它还会创建数千个UI元素吗?或者我是否必须创建一个待显示元素的新列表?

2 个答案:

答案 0 :(得分: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;
        }
    }

答案 1 :(得分:1)

检查CollectionViewSource ClassCollectionViewSource.Filter Event

查看(部分示例):

<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);
}