数据绑定未绑定数据触发器上的Icollectionview过滤器

时间:2019-03-29 14:06:35

标签: c# wpf icollectionview

我有一个数据网格,需要在两个不同的事件时间代表两种类型的数据集。

  1. 在表单加载时-数据网格显示不带任何过滤功能的modelclasswithcombobox

  2. 单击按钮-数据网格显示带有过滤功能的modelclasswithcombobox (所以我打算在这里过滤modelclasswithcombobox并在事件中显示它)

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上的断点的帮助下看到结果是预期的。但是在显示数据网格时,即使标题也没有显示。

我还发现筛选不适用于数据触发器绑定。

有人可以帮我解决这个问题。

0 个答案:

没有答案