我遇到了一个问题,我使用datagridand某些文本框过滤系统创建了一个使用命令的文本框过滤系统,因此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>使用ICommand,我成功地创建了一个简单的过滤器,看起来像
public void Filter(object obj)
{
this.Candidates.Filter = item =>
{
Candidate candidate = item as Candidate;
return candidate.firstname.Contains(obj.ToString()) || candidate.lastname.Contains(obj.ToString());
};
this.Candidates.Refresh();
}他被命令叫走了:
this.FirstameCommand = new RelyCommand(Filter, param => this.canExecute);
this.LastnameCommand = new RelyCommand(Filter, param => this.canExecute);问题就在这里。当我只使用名称进行过滤时,它工作得很好,但是当我调用LastnameCommand时,当我在filter方法中有空引用异常时,它应该是空的,就像我输入姓氏时一样。
现在是否有一种方法来聚合过滤器,所以它会排序,例如,如果我输入名字,它会过滤所有的名字,如果我输入姓氏,它会过滤所有的名字和姓氏??
发布于 2017-01-12 16:43:33
您应该确保Filter方法不会引发任何异常:
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();
}但是,如果要同时对名称和姓氏进行筛选,则应该将TextBoxes绑定到视图模型的两个源属性,并在设置器中调用filter方法:
<TextBox x:Name="txtFirstnameFilter" MinWidth="50" Text="{Binding FirstNameToFilterOn}" />
<Label Content="Nazwisko" />
<TextBox x:Name="txtLastnameFilter" MinWidth="50" Text="{Binding LastNameToFilterOn}" />private string _f;
public string FirstNameToFilterOn
{
get { return _f; }
set { _f = value; Filter(); }
}
private string _l;
public string LastNameToFilterOn
{
get { return _l; }
set { _l = value; Filter(); }
}
public void Filter()
{
this.Candidates.Filter = item =>
{
Candidate candidate = item as Candidate;
if (candidate == null)
return false;
return (string.IsNullOrEmpty(FirstNameToFilterOn) || string.IsNullOrEmpty(candidate.firstname) || candidate.firstname.Contains(FirstNameToFilterOn))
&& (string.IsNullOrEmpty(LastNameToFilterOn) || string.IsNullOrEmpty(candidate.lastname) || candidate.lastname.Contains(LastNameToFilterOn));
};
this.Candidates.Refresh();
}否则,Filter方法不知道其他名称的任何信息,即它只知道作为参数传递给命令的名称(名或姓)。
https://stackoverflow.com/questions/41616955
复制相似问题