کنترل ListView

این کنترل در برنامه‌های ویندوزی کاربرد زیادی دارد و با استفاده از آن می‌توان لیستی از داده‌ها را نمایش داد. اگر شما قبلاً با ویندوز فرم کار کرده باشید، پس با کاربرد ListView به خوبی آشنا هستید. اما نکته‌ای که باید به آن توجه کنید این است که کنترل ListView در WPF با نسخه ویندوز فرمی آن متفاوت است. ویندوز فرم برای نمایش ListView فقط از توابع Windows API استفاده می‌کند ولی ListView در WPF یک کنترل مستقل است و وابستگی به Windows API ندارد. در این بخش می‌خواهیم یک مثال از ساده‌ترین شکل کنترل ListView را مورد بررسی قرار دهیم. به کد زیر توجه کنید:

<Grid>
    <ListView Margin="10">
        <ListViewItem>Germany</ListViewItem>
        <ListViewItem IsSelected="True">France</ListViewItem>
        <ListViewItem>Brazil</ListViewItem>
    </ListView>
</Grid>

زمانی که این برنامه را اجرا کنید خروجی زیر را نمایش می‌دهد:

در این مثال ساده با استفاده از ListViewItem سه آیتم را به صورت دستی به ListView اضافه کردیم.

استفاده از تصویر در ListViewItem

در WPF امکانات فوق العاده ای برای طراحی کنترل‌های اختصاصی وجود دارد. از آنجایی که ListViewItem از کلاس ContentControl ارث بری می‌کند، بنابراین شما در بدنه ListViewItem می‌توانید هر کنترلی که می‌خواهید را قرار دهید. برای این منظور کافی است یکی از پنل هایی که در بخش‌های قبلی یاد گرفتید را داخل ListViewItem قرار داده و داخل آن پنل کنترل‌های مورد نظر خود را قرار دهید. در اینجا قصد داریم داخل هر ListViewItem یک تصویر و یک متن را قرار دهیم. به مثال زیر توجه کنید:

<Grid>
    <ListView Margin="10">

        <ListViewItem>
            <StackPanel Orientation="Horizontal">
                <Image Source="icons/Germany.png" Margin="0,0,5,0" Width="30"/>
                <TextBlock VerticalAlignment="Center">Germany</TextBlock>
            </StackPanel>
        </ListViewItem>

        <ListViewItem>
            <StackPanel Orientation="Horizontal">
                <Image Source="icons/France.png" Margin="0,0,5,0" Width="30"/>
                <TextBlock VerticalAlignment="Center">France</TextBlock>
            </StackPanel>
        </ListViewItem>

        <ListViewItem IsSelected="True">
            <StackPanel Orientation="Horizontal">
                <Image Source="icons/Brazil.png" Margin="0,0,5,0" Width="30"/>
                <TextBlock VerticalAlignment="Center">Brazil</TextBlock>
            </StackPanel>
        </ListViewItem>

    </ListView>
</Grid>

زمانی که این برنامه را اجرا کنیم خروجی زیر را نمایش می‌دهد:

اضافه کردن آیتم به ListView با کد نویسی

در بخش قبلی شما با نحوه اضافه کردن یک آیتم به کنترل ListView به صورت دستی آشنا شدید. در این بخش قصد داریم نحوه اضافه کردن یک آیتم با استفاده از کدهای سی شارپ را مورد بررسی قرار دهیم. به برنامه زیر توجه کنید:

<Grid>
    <ListView Margin="10" Name="listViewUsers"></ListView>
</Grid>

در قسمت کدنویسی سی شارپ هم کدهای زیر را بنویسید:

using System.Collections.Generic;
using System.Windows;
namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<User> items = new List<User>();
            items.Add(new User() { Name = "John Doe" , Age = 42 });
            items.Add(new User() { Name = "Jane Doe" , Age = 39 });
            items.Add(new User() { Name = "Sammy Doe", Age = 13 });
            listViewUsers.ItemsSource = items;

        }

        public class User
        {
            public string Name { get; set; }
            public int    Age  { get; set; }
        }
    }
}

زمانی که این برنامه را اجرا کنید خروجی زیر را نمایش می‌دهد:

در این برنامه ما یک ListView به نام listViewUsers را در کدهای XAML اضافه کردیم. حال برای اینکه آیتم‌های مورد نظرمان را به این ListView اضافه کنیم ابتدا یک کلاس به نام User ایجاد کردیم و دو فیلد Name و Age را برای آن در نظر گرفتیم. توجه داشته باشید که ایجاد کردن کلاس User دلخواه است.
سپس در متد سازنده کلاس MainWindow یک List از نوع کلاس User به نام items ایجاد کردیم. در اینجا شما به جای User می‌توانید یک نوع داده مانند int ،string و … را قرار دهید. سپس با استفاده از متد ()Add آیتم‌های مورد نظرمان را به List اضافه کردیم. آیتم‌های ما در اینجا اشیائی هستند که از کلاس User تعریف کردیم. در نهایت خاصیت ItemSource مربوط به ListView را برابر با items قرار دادیم.
اما زمانی که برنامه را اجرا کردیم خروجی مورد نظر ما را نمایش نداد. دلیل این موضوع این است که در دات نت، زمانی که می‌خواهید شیء ساخته شده از یک کلاس را در قالب یک رشته (string) در برنامه نمایش دهید به صورت خودکار متد ()ToString را فراخوانی می‌کند و مقداری که این متد بر می‌گرداند را در برنامه نمایش می‌دهد. برای رفع این مشکل کافی است متد ToString را در کلاس مورد نظرتان Override کنید:

public class User
{
    public string Name { get; set; }
    public int    Age  { get; set; }

    public override string ToString()
    {
        return this.Name + ", " + this.Age + " years old";
    }
}

حال زمانی که دوباره برنامه را اجرا کنید خروجی زیر را نمایش می‌دهد:

استفاده از ItemTemplate در ListView

در بخش قبلی، زمانی که یک شیء از کلاس User را به List اضافه کردیم، برای اینکه اطلاعات به درستی در برنامه نمایش داده شود متد ()ToString را Override کردیم. اما در این بخش قصد داریم با استفاده از ItemTemplate یک قالب را برای داده‌های ListView تعریف کنیم تا نحوه نمایش آن‌ها را متناسب با نیاز خود تغییر دهیم. برای درک بهتر به برنامه زیر توجه کنید:

<Grid>
    <ListView Margin="10" Name="listViewUsers">
        <ListView.ItemTemplate>
            <DataTemplate>
                <WrapPanel>
                    <TextBlock Text="Name: " />
                    <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                    <TextBlock Text=", " />
                    <TextBlock Text="Age: " />
                    <TextBlock Text="{Binding Age}" FontWeight="Bold" />
                    <TextBlock Text=" (" />
                    <TextBlock Text="{Binding Mail}" TextDecorations="Underline" Foreground="Blue" Cursor="Hand" />
                    <TextBlock Text=")" />
                </WrapPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

در قسمت کدنویسی سی شارپ هم کدهای زیر را بنویسید:

using System.Collections.Generic;
using System.Windows;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<User> items = new List<User>();
            items.Add(new User() { Name = "John Doe" , Age = 42, Mail = "john@doe-family.com" });
            items.Add(new User() { Name = "Jane Doe" , Age = 39, Mail = "jane@doe-family.com" });
            items.Add(new User() { Name = "Sammy Doe", Age = 13, Mail = "sammy.doe@gmail.com" });
            listViewUsers.ItemsSource = items;
        }
    }

    public class User
    {
        public string Name { get; set; }
        public int    Age  { get; set; }
        public string Mail { get; set; }
    }
}

زمانی که این برنامه را اجرا کنیم خروجی زیر را نمایش می‌دهد:

برای اینکه یک قالب را برای داده‌های ListView تعریف کنیم ابتدا باید عنصر ListView.ItemTemplate و سپس DataTemplate را به آن اضافه می‌کنیم. قالبی که در اینجا تعریف می‌کنیم به تمام آیتم‌هایی که به ListView اضافه می‌شوند، اعمال می‌شود.
در این برنامه با استفاده از تعدادی TextBlock، قالب داده‌های ListView را تعریف کردیم. استفاده از کنترل TextBlock و نحوه چیدن عناصر کاملاً اختیاری است و شما حتی می‌توانید یک تصویر را برای هر آیتم در نظر بگیرید. تنها نکته مهمی که در اینجا وجود دارد نحوه اتصال خاصیت Text این TextBlock ها داده‌های ListView است. برای این منظور از Binding استفاده می‌کنیم. برای مثال TextBlock دوم را به صورت زیر تعریف کردیم:

<TextBlock Text="{Binding Name}" FontWeight="Bold" />

ما در کلاس User یک فیلد به نام Name داشتیم و در اینجا قصد داریم Name را به خاصیت Text این TextBlock متصل کنیم. یعنی می‌خواهیم هر مقداری که در فیلد Name قرار گرفت، در خاصیت Text این TextBlock نیز قرار بگیرد. برای این منظور ابتدا مقابل خاصیت Text این TextBlock یک “{ }” را قرار می‌دهیم، سپس کلمه کلیدی Binding را نوشته و در ادامه نام فیلد مورد نظرمان که در اینجا Name است را می‌نویسیم.
این کار را برای سایر TextBlock هایی که می‌خواهیم مقدار آن‌ها در زمان اجرا مشخص شود نیز انجام می‌دهیم. حال زمانی که در سی شارپ یک شیء از کلاس User را به عنوان یک آیتم به List اضافه می‌کنیم، قالبی که برای هر آیتم تعریف کرده‌ایم را بر روی آن اعمال می‌کند.

نمایش ListView به صورت جدولی

در بخش قبلی شما شکل ساده کنترل ListView را مشاهده کردید. در این بخش قصد داریم اطلاعات موجود در یک ListView را به صورت جدولی نمایش دهیم. برای درک بهتر به برنامه زیر توجه کنید:

<Grid>
    <ListView Margin="10" Name="listViewUsers">
        <ListView.Resources>
            <Style TargetType="{x:Type GridViewColumnHeader}">
                <Setter Property="HorizontalContentAlignment" Value="Left" />
            </Style>
        </ListView.Resources>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}"/>
                <GridViewColumn Header="Age"  Width="50"  DisplayMemberBinding="{Binding Age}" />
                <GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

با کدهای سی شارپی که نوشته اید کاری نداشته باشید. زمانی که این برنامه را اجرا کنیم خروجی زیر را نمایش می‌دهد:

برای اینکه اطلاعات ListView را به صورت جدولی نمایش دهیم ابتدا عنصر ListView.View را به بدنه ListView اضافه کردیم. سپس یک GridView داخل آن تعریف کردیم و در نهایت با استفاده از عنصر GridViewColumn ستون‌های مورد نظرمان را داخل آن تعریف کردیم.
مشابه کاری که در بخش قبلی یعنی ItemTemplate انجام دادیم، برای اینکه فیلدهای کلاس User را به ستون‌های GridView متصل کنیم از Binding استفاده می‌کنیم. اما در اینجا به جای خاصیت Text از خاصیت DisplayMemberBinding استفاده می‌کنیم. حال زمانی که برنامه را اجرا کنید مقدار مربوط به هر کدام از فیلدها در ستونی که برای آن مشخص کردیم قرار می‌گیرد.

راست چین کردن جدول در ListView

در حالت عادی عناصر یک ListView چپ چین هستند. اما در برنامه‌های فارسی نیاز داریم تا ستون‌ها و متن داخل آن‌ها را راست چین کنیم. برای راست چین کردن جدول، ابتدا عنصر ListView.Resources را به ListView اضافه می‌کنیم. سپس یک Style را داخل آن تعریف کرده و با استفاده از Setter خاصیت FlowDirection را برابر با RightToLeft قرار می‌دهیم. به این ترتیب کنترل ListView به طور کامل راست چین می‌شود:

<ListView.Resources>
    <Style TargetType="{x:Type ListView}">
        <Setter Property="FlowDirection" Value="RightToLeft" />
    </Style>

    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    </Style>
</ListView.Resources>

زمانی که این برنامه را اجرا کنید خروجی زیر را نمایش می‌دهد:

اگر به تصویر بالا توجه کنید، مشاهده می‌کنید که عنوان ستون‌ها به صورت وسط چین نمایش داده شده است. در اینجا یک Style دیگر را به ListView.Resources اضافه کردیم تا خاصیت HorizontalContentAlignment مربوط به GridViewColumnHeader را به Left تغییر دهد. نکته مهمی که باید به آن توجه کنید این است که از آنجایی که کل کنترل ListView را راست چین کردیم، تمامی ترازها بر عکس خواهند شد. برای مثال در کد بالا ما برای اینکه عنوان ستون‌ها را راست چین کنیم مقدار HorizontalContentAlignment را برابر با Left قرار دادیم.

قالب بندی سلول‌های جدول در ListView

استفاده از خاصیت DisplayMemberBinding برای نمایش یک متن ساده کاربرد دارد. اما شما با استفاده از خاصیت CellTemplate می‌توانید ظاهر سلول‌های جدول را شخصی سازی کنید. به مثال زیر توجه کنید:

<Grid>
    <ListView Margin="10" Name="listViewUsers">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Age"  Width="50"  DisplayMemberBinding="{Binding Age}" />
                <GridViewColumn Header="Mail" Width="150">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Mail}" 
                                       TextDecorations="Underline" 
                                       Foreground="Blue" 
                                       Cursor="Hand" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

با کدهای سی شارپی که نوشته اید کاری نداشته باشید. زمانی که این برنامه را اجرا کنیم خروجی زیر را نمایش می‌دهد:

در این برنامه با استفاده از خاصیت CellTemplate در داخل ستون سوم یا همان Mail یک TextBlock قرار دادیم و خاصیت Text آن را به فیلد Mail متصل کردیم و رنگ و فرمت مورد نظر خودمان را به آن اعمال کردیم.

گروه بندی در ListView

در این بخش قصد داریم یکی دیگر از ویژگی‌های کنترل ListView که گروه بندی آیتم‌ها است را مورد بررسی قرار دهیم. برای درک بهتر به مثال زیر توجه کنید:

<Grid Margin="10">
    <ListView Name="listViewUsers">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Age"  Width="50"  DisplayMemberBinding="{Binding Age}" />
            </GridView>
        </ListView.View>

        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock FontWeight="Bold" FontSize="14" Text="{Binding Name}"/>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListView.GroupStyle>
    </ListView>
</Grid>

در قسمت کدنویسی سی شارپ هم کدهای زیر را بنویسید:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<User> items = new List<User>();
            items.Add(new User() { Name = "John Doe", Age = 42, Gender = GenderType.Male });
            items.Add(new User() { Name = "Jane Doe", Age = 39, Gender = GenderType.Female });
            items.Add(new User() { Name = "Sammy Doe", Age = 13, Gender = GenderType.Male });
            listViewUsers.ItemsSource = items;

            CollectionView view =
                (CollectionView)CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource);
            PropertyGroupDescription groupDescription = new PropertyGroupDescription("Gender");
            view.GroupDescriptions.Add(groupDescription);
        }
    }

    public enum GenderType { Male, Female };

    public class User
    {
        public string     Name   { get; set; }
        public int        Age    { get; set; }
        public string     Mail   { get; set; }
        public GenderType Gender { get; set; }
    }
}

زمانی که این برنامه را اجرا کنیم خروجی زیر را نمایش می‌دهد:

در این برنامه یک کلاس به نام User داریم که شامل فیلدهای Name ،Age ،Mail و Gender می‌باشد. در این برنامه قصد داریم آیتم‌های موجود در لیست را به دو گروه Male و Female تقسیم کنیم. به عبارت دیگر می‌خواهیم بر اساس فیلد Gender گروه بندی آیتم‌ها را انجام دهیم.
در کد XAML برنامه یک ListView تعریف کردیم و با استفاده از GridView که در بخش‌های قبلی با آن آشنا شدید دو ستون را برای جدولمان در نظر گرفتیم. حال برای اینکه یک قالب را برای گروه بندی ایجاد کنیم عنصر ListView.GroupStyle را به ListView اضافه می‌کنیم. داخل این عنصر یک TextBlock قرار دادیم و فونت آن را کمی تغییر دادیم تا از عناصر لیست متمایز شود.
نکته مهمی که باید به آن توجه کنید این است که {Binding Name} به این معنی نیست که می‌خواهیم مقدار فیلد Name در خاصیت Text این TextBlock قرار بگیرد، بلکه نامی است که WPF بر اساس فیلدی که ما برای گروه بندی مشخص می‌کنیم در نظر می‌گیرد. برای مثال اگر ما بخواهیم گروه بندی آیتم‌های لیست بر اساس فیلد Gender انجام شود، از آنجایی که این فیلد می‌تواند یکی از دو مقدار Male و Female را به خود بگیرد، بنابراین WPF به صورت خودکار به جای Name در {Binding Name} دو مقدار Male و Female قرار می‌گیرد و در نهایت ما دو گروه خواهیم داشت. حال برای اینکه فیلد مورد نظرمان را که می‌خواهیم گروه بندی آیتم‌ها بر اساس آن انجام شود را به WPF معرفی کنیم کافی است سه خط کد زیر را بنویسیم:

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource);
PropertyGroupDescription groupDescription = new PropertyGroupDescription("Gender");
view.GroupDescriptions.Add(groupDescription);

در اینجا ما فیلد Gender را به عنوان شاخص به WPF معرفی کردیم. اکنون زمانی که برنامه را اجرا کنید آیتم‌ها را به دو گروه Male و Female تقسیم می‌کند.

مرتب سازی در ListView

در این بخش قصد داریم نحوه مرتب سازی عناصر یک ListView را مورد بررسی قرار دهیم. به مثال زیر توجه کنید:

<Grid Margin="10">
    <ListView Name="listViewUsers">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}"/>
                <GridViewColumn Header="Age"  Width="50"  DisplayMemberBinding="{Binding Age}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

در قسمت کدنویسی سی شارپ هم کدهای زیر را بنویسید:

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<User> items = new List<User>();
            items.Add(new User() { Name = "John Doe" , Age = 42 });
            items.Add(new User() { Name = "Jane Doe" , Age = 39 });
            items.Add(new User() { Name = "Sammy Doe", Age = 13 });
            items.Add(new User() { Name = "Donna Doe", Age = 13 });
            listViewUsers.ItemsSource = items;

            CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource);
            view.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Ascending));
        }
    }
    public class User
    {
        public string Name { get; set; }
        public int     Age { get; set; }
    }
}

زمانی که این برنامه را اجرا کنیم خروجی زیر را نمایش می‌دهد:

برای اینکه عناصر موجود در لیست را مرتب کنید کافی است دو خط زیر را بنویسید:

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource);
view.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Ascending));

در اینجا ما به WPF می گوییم که عناصر لیست را بر اساس مقادیر فیلد Age و به صورت صعودی مرتب کند. برای اینکه به صورت نزولی مرتب سازی را انجام دهید کافی است ListSortDirection.Ascending را به ListSortDirection.Descending تغییر دهید.

مرتب سازی بر اساس چند فیلد

ما در بخش قبلی مرتب سازی آیتم‌های لیست را بر اساس فیلد Age انجام دادیم. در اینجا “Sammy Doe” و “Donna Doe” سن‌های یکسانی دارند اما از نظر ترتیب حروف الفبا “Donna Doe” باید قبل از “Sammy Doe” بیاید. پس ما می‌خواهیم مرتب سازی آیتم‌های لیست بر اساس فیلد Age انجام شود و اگر دو آیتم دارای Age های یکسانی بودند، مرتب سازی را بر اساس فیلد Name انجام دهد. برای این منظور کافی کد زیر را به برنامه اضافه کنید:

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource);
view.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Ascending));
view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

حال اگر دوباره برنامه را اجرا کنید خروجی زیر را نمایش می‌دهد:

فیلتر کردن عناصر ListView

در این بخش قصد داریم نحوه فیلتر کردن عناصر یک ListView را مورد بررسی قرار دهیم. از فیلتر کردن معمولاً برای جستجو در ListView استفاده می‌شود. برای درک بهتر به مثال زیر توجه کنید:

<DockPanel Margin="10">
    <TextBox DockPanel.Dock="Top" Margin="0,0,0,10" 
                Name="textBoxFilter" 
                TextChanged="textBoxFilter_TextChanged" />
    <ListView Name="listViewUsers">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Age"  Width="50"  DisplayMemberBinding="{Binding Age}" />
            </GridView>
        </ListView.View>
    </ListView>
</DockPanel>

در قسمت کدنویسی سی شارپ هم کدهای زیر را بنویسید:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<User> items = new List<User>();
            items.Add(new User() { Name = "John Doe", Age = 42 });
            items.Add(new User() { Name = "Jane Doe", Age = 39 });
            items.Add(new User() { Name = "Sammy Doe", Age = 13 });
            items.Add(new User() { Name = "Donna Doe", Age = 13 });
            listViewUsers.ItemsSource = items;

            CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource);
            view.Filter = UserFilter;
        }

        private bool UserFilter(object item)
        {
            if (String.IsNullOrEmpty(textBoxFilter.Text))
                return true;
            else
                return ((item as User).Name.IndexOf(textBoxFilter.Text, StringComparison.OrdinalIgnoreCase) >= 0);
        }

        private void textBoxFilter_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource).Refresh();
        }
    }

    public enum SexType { Male, Female };

    public class User
    {
        public string   Name { get; set; }
        public int      Age  { get; set; }
        public string   Mail { get; set; }
        public SexType  Sex  { get; set; }
    }
}

زمانی که این برنامه را اجرا کنید خروجی زیر را نمایش می‌دهد:

در این برنامه علاوه بر ListView، یک TextBox نیز داریم تا عبارت مورد نظرمان را داخل آن جستجو کنیم. برای اینکه یک فیلتر را به آیتم‌های ListView اعمال کنیم کافی است دو خط زیر را بنویسیم:

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource);
view.Filter = UserFilter;

در اینجا UserFilter متدی است که عبارت تایپ شده در TextBox را با تک تک آیتم‌های لیست مقایسه می‌کند. این متد یک پارامتر از نوع object دریافت می‌کند و خروجی آن نیز یک مقدار true یا false است.WPF به صورت خودکار تمامی آیتم‌های لیست را به این متد ارسال می‌کند و فقط زمانی آن آیتم را در ListView نمایش می‌دهد که نتیجه مقایسه‌ای که داخل متد انجام می‌دهیم true باشد.

در این برنامه ابتدا بررسی می‌کنیم که TextBox خالی نباشد. اگر خالی بود مقدار true را بر می‌گردانیم. به عبارت دیگر تا زمانی که کاربر عبارتی را در TextBox تایپ نکرده، نمی‌خواهیم فیلتری اعمال شود. اگر کاربر عبارتی را در TextBox تایپ کرده بود بررسی می‌کنیم که آیا فیلد Name آیتم انتخاب شده شامل این عبارت می‌باشد یا خیر. اگر باشد مقدار true و در غیر این صورت مقدار false را بر می‌گرداند. برای اینکه هر بار که کاربر چیزی را در TextBox تایپ می‌کند، WPF فیلتر را بر روی آیتم‌های لیست اعمال کنید کافی است کد زیر را در رویداد TextChanged مربوط به TextBox بنویسیم:

CollectionViewSource.GetDefaultView(listViewUsers.ItemsSource).Refresh();