Collectoiview.Filter不过滤数据

时间:2018-10-17 14:03:52

标签: c# wpf xaml mvvm collectionview

用C#WPF MVVM编写的应用程序存在很大问题。 当我运行我的应用程序并在EmployeeName文本框中输入例如字母“ A”时,我的应用程序会动态过滤数据,然后很快我的数据就不会被过滤。

enter image description here

但是当我在EmployeeName属性中同时注释两个if时(此属性是我的代码的顶部),筛选器对于其他文本框也可以正常工作。你可以帮帮我吗?我在下面放置了模型和xaml。

Employee.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Windows;
using System.Collections.ObjectModel;
using System.Windows.Data;
using System.Windows.Threading;

namespace OneWayTwoWayBinding
{
    public class Employee : INotifyPropertyChanged
    {
        private string employeeName;
        private int? employeeID;
        private int? employeeSalary;
        private string employeeDesigner;
        private string employeeEmailID;
        private Employee selectedEmployee;
        private ICollectionView filteredCollection;
        private string dynamicSearchEmployeeName;
        private int? dynamicSearchEmployeeID;
        private int? dynamicSearchEmployeeSalary;
        private string dynamicSearchEmployeeDesigner;
        private string dynamicSearchEmployeeEmailID;
        private int isSelected;
        private string modeOfExecuting;
        private string rememberValueEmployeeName;
        private int? rememberValueEmployeeID;
        private int? rememberValueEmployeeSalary;
        private string rememberValueEmployeeDesigner;
        private string rememberValueEmployeeEmailID;
        private ObservableCollection<Employee> employees;


        public string EmployeeName
        {
            get
            {
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => (String.IsNullOrEmpty(employeeName) || ((Employee)x).EmployeeName.Contains(employeeName)); // comment if
                return employeeName;
            }
            set
            {
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => (String.IsNullOrEmpty(employeeName) || ((Employee)x).EmployeeName.Contains(employeeName)); //[![enter image description here][1]][1]comment if
                employeeName = value;
                OnPropertyChanged("EmployeeName");
            }
        }
        public int? EmployeeID
        {
            get
            {
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => ((employeeID == null) || ((Employee)x).EmployeeID == employeeID);
                return employeeID;
            }
            set
            {

                employeeID = value;
                OnPropertyChanged("EmployeeID");
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => ((employeeID == null) || ((Employee)x).EmployeeID == employeeID);
            }
        }
        public int? EmployeeSalary
        {
            get
            {
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => ((employeeSalary == null) || ((Employee)x).EmployeeSalary == employeeSalary);
                return employeeSalary;
            }
            set
            {
                employeeSalary = value;
                OnPropertyChanged("EmployeeSalary");
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => ((employeeSalary == null) || ((Employee)x).EmployeeSalary == employeeSalary);
            }
        }
        public string EmployeeDesigner
        {
            get
            {
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(employeeDesigner)));
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => (String.IsNullOrEmpty(employeeDesigner) || ((Employee)x).EmployeeDesigner.Contains(employeeDesigner));
                return employeeDesigner;
            }
            set
            {
                employeeDesigner = value;
                OnPropertyChanged("EmployeeDesigner");
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => (String.IsNullOrEmpty(employeeDesigner) || ((Employee)x).EmployeeDesigner.Contains(employeeDesigner));
            }
        }
        public string EmployeeEmailID
        {
            get
            {
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => (String.IsNullOrEmpty(employeeEmailID) || ((Employee)x).EmployeeEmailID.Contains(employeeEmailID));
                return employeeEmailID;
            }
            set
            {
                employeeEmailID = value;
                OnPropertyChanged("EmployeeEmailID");
                if (FilteredCollection != null)
                    FilteredCollection.Filter = x => (String.IsNullOrEmpty(employeeEmailID) || ((Employee)x).EmployeeEmailID.Contains(employeeEmailID));
            }
        }
        public ObservableCollection<Employee> Employees
        {
            get
            {
                return employees;
            }
            set
            {
                employees = value;
                OnPropertyChanged("Employees");
            }
        }

        public Employee SelectedEmployee
        {
            get
            {
                if (selectedEmployee == null)
                {
                    ModeOfExecuting = "Searching / Adding Mode";
                }
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(selectedEmployee.SelectedEmployee.ToString())));
                return selectedEmployee;
            }
            set
            {
                selectedEmployee = value;

                if (selectedEmployee == null)
                {
                    ModeOfExecuting = "Searching / Adding Mode";
                    OnPropertyChanged("SelectedEmployee");
                    OnPropertyChanged("ModeOfExecuting");
                }

                if (selectedEmployee != null)
                {
                    if (selectedEmployee.EmployeeName != string.Empty)
                    {
                        RememberValueEmployeeName = selectedEmployee.EmployeeName;
                        DynamicSearchEmployeeName = RememberValueEmployeeName;

                    }
                    if (selectedEmployee.EmployeeID != null)
                    {
                        RememberValueEmployeeID = selectedEmployee.EmployeeID;
                        DynamicSearchEmployeeID = RememberValueEmployeeID;
                    }
                    if (selectedEmployee.EmployeeSalary != null)
                    {
                        RememberValueEmployeeSalary = selectedEmployee.EmployeeSalary;
                        DynamicSearchEmployeeSalary = RememberValueEmployeeSalary;
                    }
                    if (selectedEmployee.EmployeeDesigner != string.Empty)
                    {
                        RememberValueEmployeeDesigner = selectedEmployee.EmployeeDesigner;
                        DynamicSearchEmployeeDesigner = RememberValueEmployeeDesigner;
                    }
                    if (selectedEmployee.EmployeeEmailID != string.Empty)
                    {
                        RememberValueEmployeeEmailID = selectedEmployee.EmployeeEmailID;
                        DynamicSearchEmployeeEmailID = RememberValueEmployeeEmailID;
                    }

                    ModeOfExecuting = "Editing Mode";

                    OnPropertyChanged("SelectedEmployee");
                    OnPropertyChanged("ModeOfExecuting");
                    OnPropertyChanged("RememberValueEmployeeName");
                    OnPropertyChanged("DynamicSearchEmployeeName");
                    OnPropertyChanged("RememberValueEmployeeID");
                    OnPropertyChanged("DynamicSearchEmployeeID");
                    OnPropertyChanged("RememberValueEmployeeSalary");
                    OnPropertyChanged("DynamicSearchEmployeeSalary");
                    OnPropertyChanged("RememberValueEmployeeDesigner");
                    OnPropertyChanged("RememberValueEmployeeDesigner");
                    OnPropertyChanged("RememberValueEmployeeEmailID");
                    OnPropertyChanged("DynamicSearchEmployeeEmailID");
                }

                //selectedEmployee = value;
                OnPropertyChanged("SelectedEmployee");
            }
        }

        public string DynamicSearchEmployeeName
        {
            get
            {
                if (SelectedEmployee == null)
                {
                    //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show("null")));
                    EmployeeName = dynamicSearchEmployeeName;
                    //RememberValue = dynamicSearchEmployeeName;
                }
                return dynamicSearchEmployeeName;
            }
            set
            {
                dynamicSearchEmployeeName = value;
                OnPropertyChanged("DynamicSearchEmployeeName");
            }
        }
        public int? DynamicSearchEmployeeID
        {
            get
            {
                if (SelectedEmployee == null)
                {
                    EmployeeID = dynamicSearchEmployeeID;
                }
                return dynamicSearchEmployeeID;
            }
            set
            {
                dynamicSearchEmployeeID = value;
                OnPropertyChanged("DynamicSearchEmployeeID");
            }
        }
        public int? DynamicSearchEmployeeSalary
        {
            get
            {
                if (SelectedEmployee == null)
                {
                    EmployeeSalary = dynamicSearchEmployeeSalary;
                }

                return dynamicSearchEmployeeSalary;
            }
            set
            {
                dynamicSearchEmployeeSalary = value;
                OnPropertyChanged("DynamicSearchEmployeeSalary");
            }
        }
        public string DynamicSearchEmployeeDesigner
        {
            get
            {
                if (SelectedEmployee == null)
                {
                    EmployeeDesigner = dynamicSearchEmployeeDesigner;
                }
                return dynamicSearchEmployeeDesigner;
            }
            set
            {
                dynamicSearchEmployeeDesigner = value;
                OnPropertyChanged("DynamicSearchEmployeeDesigner");
            }
        }
        public string DynamicSearchEmployeeEmailID
        {
            get
            {
                if (SelectedEmployee == null)
                {
                    EmployeeEmailID = dynamicSearchEmployeeEmailID;
                }
                return dynamicSearchEmployeeEmailID;
            }
            set
            {
                dynamicSearchEmployeeEmailID = value;
                OnPropertyChanged("DynamicSearchEmployeeEmailID");
            }

        }
        public ICollectionView FilteredCollection
        {
            get
            {
                return filteredCollection;
            }
            set
            {
                filteredCollection = value;
                OnPropertyChanged("FilteredCollection");
            }
        }

        public int IsSelected
        {
            get
            {
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(changedPathBinding.ToString())));
                return isSelected;
            }
            set
            {
                isSelected = value;
                OnPropertyChanged("IsSelected");
                //SelectedEmployee.EmployeeName
            }
        }

        public string ModeOfExecuting
        {
            get
            {
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(modeOfExecuting.ToString())));
                return modeOfExecuting;
            }
            set
            {
                modeOfExecuting = value;
                OnPropertyChanged("ModeOfExecuting");
            }
        }
        public string RememberValueEmployeeName
        {
            get
            {
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(changedPathBinding.ToString())));
                return rememberValueEmployeeName;
            }
            set
            {
                rememberValueEmployeeName = value;
                OnPropertyChanged("RememberValueEmployeeName");
            }
        }
        public int? RememberValueEmployeeID
        {
            get
            {
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(changedPathBinding.ToString())));
                return rememberValueEmployeeID;
            }
            set
            {
                rememberValueEmployeeID = value;
                OnPropertyChanged("RememberValueEmployeeID");
            }
        }
        public int? RememberValueEmployeeSalary
        {
            get
            {
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(changedPathBinding.ToString())));
                return rememberValueEmployeeSalary;
            }
            set
            {
                rememberValueEmployeeSalary = value;
                OnPropertyChanged("RememberValueEmployeeSalary");
            }
        }
        public string RememberValueEmployeeDesigner
        {
            get
            {
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(changedPathBinding.ToString())));
                return rememberValueEmployeeDesigner;
            }
            set
            {
                rememberValueEmployeeDesigner = value;
                OnPropertyChanged("RememberValueEmployeeDesigner");
            }
        }
        public string RememberValueEmployeeEmailID
        {
            get
            {
                //Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(changedPathBinding.ToString())));
                return rememberValueEmployeeEmailID;
            }
            set
            {
                rememberValueEmployeeEmailID = value;
                OnPropertyChanged("RememberValueEmployeeEmailID");
            }
        }


        public event PropertyChangedEventHandler PropertyChanged = null;
        virtual protected void OnPropertyChanged(string propName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }
}

MainWindows.xaml

<Window x:Class="OneWayTwoWayBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OneWayTwoWayBinding"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:ConverterStringFiltering x:Key="ConverterStringFiltering" />
        <local:ConverterButton x:Key="ConverterButton" />
        <local:ConverterIntFiltering x:Key="ConverterIntFiltering" />
    </Window.Resources>
    <Grid Margin="0,0,0,20">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ListView Name="EmployeeListView" HorizontalAlignment="Left" Height="160" Margin="0,259,0,0" VerticalAlignment="Top" Width="792" ItemsSource="{Binding FilteredCollection}" SelectedItem="{Binding SelectedEmployee, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding IsSelected}" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="EmployeeName" Width="150" DisplayMemberBinding="{Binding EmployeeName}" />
                    <GridViewColumn Header="EmployeeID" Width="150" DisplayMemberBinding="{Binding EmployeeID}" />
                    <GridViewColumn Header="EmployeeSalary" Width="150" DisplayMemberBinding="{Binding EmployeeSalary}" />
                    <GridViewColumn Header="EmployeeDesigner" Width="150" DisplayMemberBinding="{Binding EmployeeDesigner}" />
                    <GridViewColumn Header="EmployeeEmailID" Width="150" DisplayMemberBinding="{Binding EmployeeEmailID}" />
                </GridView>
            </ListView.View>
        </ListView>
        <Label Content="Employee Name" HorizontalAlignment="Left" Margin="0,52,0,0" VerticalAlignment="Top" Width="151" Height="23"/>

        <TextBox Name ="TextboxEmployeeName" HorizontalAlignment="Left" Height="23" Margin="165,52,0,0" VerticalAlignment="Top" Width="522" >
            <TextBox.Text>
                <MultiBinding Converter="{StaticResource ConverterStringFiltering}" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                    <Binding Path="SelectedEmployee.EmployeeName" Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
                    <Binding Path="DynamicSearchEmployeeName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
                </MultiBinding>
            </TextBox.Text>
        </TextBox>

        <Label Content="EmployeeID" HorizontalAlignment="Left" Margin="0,91,0,0" VerticalAlignment="Top" Width="145" Height="23"/>

        <TextBox Name ="TextboxEmployeeID" HorizontalAlignment="Left" Height="23" Margin="165,91,0,0"  VerticalAlignment="Top" Width="522" >
            <TextBox.Text>
                <MultiBinding Converter="{StaticResource ConverterIntFiltering}" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">

                    <Binding Path="SelectedEmployee.EmployeeID" Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
                    <Binding Path="DynamicSearchEmployeeID"  Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
                </MultiBinding>
            </TextBox.Text>
        </TextBox>


        <Label Content="EmpoyeeSalary" HorizontalAlignment="Left" Margin="0,131,0,0" VerticalAlignment="Top" Width="151" Height="23"/>

        <TextBox Name="TextboxEmployeeSalary" HorizontalAlignment="Left" Height="23" Margin="165,131,0,0" VerticalAlignment="Top" Width="522" >
            <TextBox.Text>
                <MultiBinding Converter="{StaticResource ConverterIntFiltering}" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">

                    <Binding Path="SelectedEmployee.EmployeeSalary" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
                    <Binding Path="DynamicSearchEmployeeSalary"  Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
                </MultiBinding>
            </TextBox.Text>
        </TextBox>

        <Label Content="EmployeeDesigner" HorizontalAlignment="Left" Margin="0,176,0,0" VerticalAlignment="Top" Width="151" Height="23"/>

        <TextBox Name ="TextboxEmployeeDesigner" HorizontalAlignment="Left" Height="23" Margin="165,176,0,0" VerticalAlignment="Top" Width="522" >
            <TextBox.Text>
                <MultiBinding Converter="{StaticResource ConverterStringFiltering}" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                    <Binding Path="SelectedEmployee.EmployeeDesigner" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
                    <Binding Path="DynamicSearchEmployeeDesigner"  Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
                </MultiBinding>
            </TextBox.Text>
        </TextBox>

        <Label Content="EmployeeEmailID" HorizontalAlignment="Left" Margin="0,221,0,0" VerticalAlignment="Top" Width="151" Height="23"/>
        <TextBox Name="TextboxEmployeeEmailID" HorizontalAlignment="Left" Height="23" Margin="165,221,0,0" VerticalAlignment="Top" Width="522" >

            <TextBox.Text>
                <MultiBinding Converter="{StaticResource ConverterStringFiltering}" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                    <Binding Path="SelectedEmployee.EmployeeEmailID" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
                    <Binding Path="DynamicSearchEmployeeEmailID"  Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
                </MultiBinding>
            </TextBox.Text>
        </TextBox>

        <Button Content="Update" HorizontalAlignment="Left" Margin="692,76,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.017,0.456" Command="{Binding UpdateCommand}" >
            <Button.CommandParameter>
                <MultiBinding Converter="{StaticResource ConverterButton}" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                    <Binding ElementName="TextboxEmployeeName" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeID" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeSalary" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeDesigner" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeEmailID" Path="Text"/>
                </MultiBinding>
            </Button.CommandParameter>
        </Button>
        <TextBlock HorizontalAlignment="Left" Margin="15,10,0,0" TextWrapping="Wrap" Text="{Binding ModeOfExecuting, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" VerticalAlignment="Top" Width="390" Height="37" FontSize="20"/>
        <Button Content="Clear" HorizontalAlignment="Left" Margin="692,116,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.017,0.456" Command="{Binding ClearCommand}" >
            <Button.CommandParameter>
                <MultiBinding Converter="{StaticResource ConverterButton}" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                    <Binding ElementName="TextboxEmployeeName" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeID" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeSalary" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeDesigner" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeEmailID" Path="Text"/>
                </MultiBinding>
            </Button.CommandParameter>
        </Button>
        <Button Content="Add" HorizontalAlignment="Left" Margin="692,161,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.017,0.456" Command="{Binding AddCommand}" >
            <Button.CommandParameter>
                <MultiBinding Converter="{StaticResource ConverterButton}" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                    <Binding ElementName="TextboxEmployeeName" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeID" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeSalary" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeDesigner" Path="Text"/>
                    <Binding ElementName="TextboxEmployeeEmailID" Path="Text"/>
                </MultiBinding>
            </Button.CommandParameter>
        </Button>
        <Button Content="Remove" HorizontalAlignment="Left" Margin="692,206,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.017,0.456" Command="{Binding RemoveCommand}" />
    </Grid>
</Window>

1 个答案:

答案 0 :(得分:1)

问题是您要覆盖每个getter中的过滤器。 更改员工姓名后,该框架可能会立即调用这些getter,从而应用其他字段的过滤器并覆盖名称过滤器

从getter中删除过滤器分配,但将其保留在setter中