C# WPF MMV ICollectionView过滤器在许多Atribute上

C# WPF MMV ICollectionView过滤器在许多Atribute上,c#,wpf,mvvm,C#,Wpf,Mvvm,我使用datagrid和一些文本框过滤系统创建了一个问题,该系统使用命令使xaml部分看起来像: <GroupBox Header="Filtry"> <StackPanel Orientation="Horizontal" > <Label Content="Imie" /> <TextBox x:Name="txtFi

我使用datagrid和一些文本框过滤系统创建了一个问题,该系统使用命令使xaml部分看起来像:

           <GroupBox Header="Filtry">
                <StackPanel Orientation="Horizontal" >
                    <Label Content="Imie" />
                    <TextBox x:Name="txtFirstnameFilter" MinWidth="50" Text="">
                        <i:Interaction.Behaviors>
                            <b:PropertyChangedCommandBehavior DependencyPropertyName="Text" PropertyChangedCommand="{Binding FirstameCommand}" />
                        </i:Interaction.Behaviors>
                    </TextBox>
                    <Label Content="Nazwisko" />
                    <TextBox x:Name="txtLastnameFilter" MinWidth="50" Text="">
                        <i:Interaction.Behaviors>
                            <b:PropertyChangedCommandBehavior DependencyPropertyName="Text" PropertyChangedCommand="{Binding LastnameCommand}" />
                        </i:Interaction.Behaviors>
                    </TextBox>
                </StackPanel>
            </GroupBox>
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding firstname}" Header="Imię" />
                    <DataGridTextColumn Binding="{Binding lastname}" Header="Nazwisko" />
                    <DataGridTextColumn Binding="{Binding email}" Header="E-Mail" />
                </DataGrid.Columns>
他被命令召唤:

                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding firstname}" Header="Imię" />
                    <DataGridTextColumn Binding="{Binding lastname}" Header="Nazwisko" />
                    <DataGridTextColumn Binding="{Binding email}" Header="E-Mail" />
                </DataGrid.Columns>
        this.FirstameCommand = new RelyCommand(Filter, param => this.canExecute);
        this.LastnameCommand = new RelyCommand(Filter, param => this.canExecute);
问题就在这里。当我只使用名称进行筛选时,它可以很好地工作,但是当我调用lastname命令时,我在filter方法中有空引用异常,这应该与我键入名称lastname为空时一样

                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding firstname}" Header="Imię" />
                    <DataGridTextColumn Binding="{Binding lastname}" Header="Nazwisko" />
                    <DataGridTextColumn Binding="{Binding email}" Header="E-Mail" />
                </DataGrid.Columns>

现在有没有一种方法可以聚合过滤器,使其排序,例如,如果我先输入姓名,它将筛选所有姓名,如果我输入姓氏,它将筛选所有姓名和姓氏???

您应该确保筛选方法不会引发任何异常:

                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding firstname}" Header="Imię" />
                    <DataGridTextColumn Binding="{Binding lastname}" Header="Nazwisko" />
                    <DataGridTextColumn Binding="{Binding email}" Header="E-Mail" />
                </DataGrid.Columns>
public void Filter(object obj)
{
    if (obj == null)
        return;

    this.Candidates.Filter = item =>
    {
        Candidate candidate = item as Candidate;
        if (candidate == null)
            return false;

        string name = obj.ToString();

        return (!string.IsNullOrEmpty(candidate.firstname) && candidate.firstname.Contains(name))
            || (!string.IsNullOrEmpty(candidate.lastname) && candidate.lastname.Contains(name));
    };
    this.Candidates.Refresh();
}
但是,如果您希望同时对名字和姓氏进行筛选,则应将文本框绑定到视图模型的两个源属性,并在以下设置器中调用filter方法:

                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding firstname}" Header="Imię" />
                    <DataGridTextColumn Binding="{Binding lastname}" Header="Nazwisko" />
                    <DataGridTextColumn Binding="{Binding email}" Header="E-Mail" />
                </DataGrid.Columns>
<TextBox x:Name="txtFirstnameFilter" MinWidth="50" Text="{Binding FirstNameToFilterOn}" />
<Label Content="Nazwisko" />
<TextBox x:Name="txtLastnameFilter" MinWidth="50" Text="{Binding LastNameToFilterOn}" />
否则,Filter方法不知道其他名称的任何信息,也就是说,它只知道作为参数传递给命令的名称(名字或姓氏)

                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding firstname}" Header="Imię" />
                    <DataGridTextColumn Binding="{Binding lastname}" Header="Nazwisko" />
                    <DataGridTextColumn Binding="{Binding email}" Header="E-Mail" />
                </DataGrid.Columns>