Привязка данных не привязывает фильтр Icollectionview к триггеру данных - PullRequest
0 голосов
/ 29 марта 2019

У меня есть сетка данных, которая должна представлять два типа набора данных в два разных времени события.

  1. При загрузке формы - сетка данных показывает модель класса с полем со списком без фильтрации

  2. при нажатии кнопки - таблица данных показывает класс модели с полем со списком (поэтому здесь я планирую отфильтровать класс модели с полем со списком и показать его по событию)

XAML:

<DataGrid  Height="150" x:Name="datagrid1" AutoGenerateColumns="True" CanUserAddRows="False" Width="467" Margin="299,-135,40,9" HorizontalAlignment="Left">
    <DataGrid.Style>
        <Style  TargetType="{x:Type DataGrid}">
            <Setter  Property="ItemsSource" Value="{Binding Populatedatagridwithobservablecollection.modelclasswithcombobox}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Isauditorsearch}" Value="True">
                    <Setter Property="ItemsSource" Value="{Binding Populatedatagridwithobservablecollection._CarListView}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Style>
</DataGrid>

После прочтения в Интернете я узнал о фильтрации ICollectionView для целей фильтрации.

public interface INofificationActionfordatagrid
{
   ObservableCollection<datagridmodel> modelclasswithcombobox { get; set;}
   ICollectionView _CarListView { get; }
   void getdatausinglinq();
}


public class PopulateDatagrid : INofificationActionfordatagrid
{
    public ObservableCollection<datagridmodel> modelclasswithcombobox { get; set; }

    //get { return CollectionViewSource.GetDefaultView(modelclasswithcombobox); } set { OnPropertyChanged("_CarListView");
    public ICollectionView _CarListView { get; set;  }

    public void Filterbind(string an)
    {
        getdatausinglinq();
        this._CarListView =  CollectionViewSource.GetDefaultView(modelclasswithcombobox); 
        this._CarListView.Filter = item =>
        {
            datagridmodel vitem = item as datagridmodel;
            return vitem != null && vitem.UserName.Contains(an);
        };

        this._CarListView.Refresh();

     }



    public void getdatausinglinq()
    {
        //ItemsView.Filter = new Predicate<object>(o => Filter(o as datagridmodel));  

        using (Operations_Productivity_ToolEntities context = new Operations_Productivity_ToolEntities())
        {
            var a1 = from t1 in context.Test_ImportedAuditdata
                     where t1.status == "Pending"
                     select t1;

            if (modelclasswithcombobox == null)
                modelclasswithcombobox = new ObservableCollection<datagridmodel>();

            foreach (var a in a1)
            {
                modelclasswithcombobox.Add(new datagridmodel
                {

                    AuditId = a.AuditId.ToString(),
                    Claimnumber = a.ClaimNumber.ToString(),
                    UserName = a.username,
                    CreateDate = a.Created_Date.ToString(),
                    ID = a.id.ToString(),
                    Status = a.status

                });
            }
            context.SaveChanges();


        }
    }
}


    public class Reassignseperately
    {
        PopulateDatagrid getdata = new PopulateDatagrid();

        public void Reassignsep(string getitem1, ViewModel an1)
        {
            an1.Isauditorsearch = true;
            getdata.Filterbind(getitem1);
        }

    }



    public class ViewModel : INotifyPropertyChanged
    {
     INofificationActionfordatagrid 
     _populatedatagridwithobservablecollection = new PopulateDatagrid();

      public INofificationActionfordatagrid 
      Populatedatagridwithobservablecollection
        {
            get
            {
                return _populatedatagridwithobservablecollection;
            }
            set
            {
                if (value != _populatedatagridwithobservablecollection)
                {
                    _populatedatagridwithobservablecollection = value;

            OnPropertyChanged("Populatedatagridwithobservablecollection");
                }
            }
        }

        private bool _Isauditorsearch;
        public bool Isauditorsearch
        {
            get { return this._Isauditorsearch; }
            set
            {
                if (this._Isauditorsearch != value)
                {
                    this._Isauditorsearch = value;
                    OnPropertyChanged("Isauditorsearch");
                }
            }
        }

        private string _CurrentItem3;
        public string Currentcomboboxitem3
        {
            get { return this._CurrentItem3; }
            set
            {
                if (this._CurrentItem3 != value)
                {
                    this._CurrentItem3 = value;
                    OnPropertyChanged("Currentcomboboxitem3");
                }
            }
        }

        public ViewModel()
        {
    Isauditorsearch = false;
    ReassignusersSeperately = new RelayCommand(o => 
                         sep.Reassignsep(Currentcomboboxitem3, this));

           }

      }

Но проблема в том, что отфильтрованное значение не связано с xaml.С помощью точки останова на _carlistview.currentItem я вижу результат, как и ожидалось.Но при отображении сетки данных ничего не отображается даже без заголовков.

Также я узнал, что фильтрация не работает для привязки триггера данных.

Может кто-нибудь помочь мне в этом вопросе.

...