C# WPF MMV ICollectionView过滤器在许多Atribute上
我使用datagrid和一些文本框过滤系统创建了一个问题,该系统使用命令使xaml部分看起来像: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
<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>