首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >许多核材料上的WPF MMV ICollectionView滤波器

许多核材料上的WPF MMV ICollectionView滤波器
EN

Stack Overflow用户
提问于 2017-01-12 15:28:05
回答 1查看 96关注 0票数 0

我遇到了一个问题,我使用datagridand某些文本框过滤系统创建了一个使用命令的文本框过滤系统,因此xaml部分看起来如下:

代码语言:javascript
复制
           <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>

数据网格:

代码语言:javascript
复制
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding firstname}" Header="Imię" />
                    <DataGridTextColumn Binding="{Binding lastname}" Header="Nazwisko" />
                    <DataGridTextColumn Binding="{Binding email}" Header="E-Mail" />
                </DataGrid.Columns>

使用ICommand,我成功地创建了一个简单的过滤器,看起来像

代码语言:javascript
复制
    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();
    }

他被命令叫走了:

代码语言:javascript
复制
        this.FirstameCommand = new RelyCommand(Filter, param => this.canExecute);
        this.LastnameCommand = new RelyCommand(Filter, param => this.canExecute);

问题就在这里。当我只使用名称进行过滤时,它工作得很好,但是当我调用LastnameCommand时,当我在filter方法中有空引用异常时,它应该是空的,就像我输入姓氏时一样。

现在是否有一种方法来聚合过滤器,所以它会排序,例如,如果我输入名字,它会过滤所有的名字,如果我输入姓氏,它会过滤所有的名字和姓氏??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-12 16:43:33

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

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
<TextBox x:Name="txtFirstnameFilter" MinWidth="50" Text="{Binding FirstNameToFilterOn}" />
<Label Content="Nazwisko" />
<TextBox x:Name="txtLastnameFilter" MinWidth="50" Text="{Binding LastNameToFilterOn}" />
代码语言:javascript
复制
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方法不知道其他名称的任何信息,即它只知道作为参数传递给命令的名称(名或姓)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41616955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档