Collectoiview.Filter does not filter the data

I have a very big problem with my application written in C# WPF MVVM. When I run my app and write in EmployeeName Textbox for example letter "A" my app dynamic filter of data and then very fast my data is unfiltered.

enter image description here

But when I comment both ifs in EmployeeName property (This property is top of my code) Filter works fine for other Textboxes. Could you help me? Below I placed my model and 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>

Upvotes: 0

Views: 63

Answers (1)

Kfir Eichenblat
Kfir Eichenblat

Reputation: 469

The problem is that you are overriding the filter in each one of your getters. The framework may be calling these getters soon after you change the employee name, thus applying filters of other fields and overriding the name filter

Remove the filter assignments from the getters, but keep them in the setters

Upvotes: 1

Related Questions