代码之家  ›  专栏  ›  技术社区  ›  Losec

使用命令过滤ObservableCollection

  •  0
  • Losec  · 技术社区  · 7 年前

    这是我的 ViewModel

    这被绑定到我的datagrid并加载我的所有数据我的问题是我已经做了一个单选按钮绑定到一个命令,当它被选中时,我希望它“过滤”我的FullItemList,只显示我的datagrid中的空行。

        public class ResidentViewModel
    {
        public ResidentViewModel()
        {
            AllRooms();
        }
        public ObservableCollection<Res_details> FullItemList { get; set; }
    
        private void AllRooms()
        {
            var items = new ObservableCollection<Res_details>();
            using (var db = new Access5687DB())
            {
                var q =
                    from c in db.Residents
                    select c;
                foreach (var c in q)
                {
                    items.Add(new Res_details()
                    {
                        ID = c.Room,
                        Name = c.Firstname,
                        LastName = c.Lastname,
                        Birthday = c.Birthday,
                        Arrival = c.Admission,
                    });
                }
                FullItemList = items;
            }
        }
    
        private ICommand filter_Empty;
        public ICommand Filter_Empty
        {
            get { if (filter_Empty == null) filter_Empty = new FilterObs(); return filter_Empty; }
            set { filter_Empty = value; }
        }
    
        private class FilterObs : ICommand
        {
            public event EventHandler CanExecuteChanged;
    
            public bool CanExecute(object parameter)
            {
                if ((string)parameter == "B")
                    return
                        true;
                if ((string)parameter != "B")
                    return
                        false;
                else
                    return
                        false;
            }
    
            public void Execute(object parameter)
            {
                  #Something needs to go here.
            }
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Anton Semenov    7 年前

    我同意SledgeHammer的观点,在这里使用ICollectionView是最好的解决方案。 若要在filter命令中访问视图模型,需要将viewModel引用传递到命令中,或者只能传递委托,如下所示(伪代码)

    public class ResidentViewModel
    {
        public ResidentViewModel()
        {
            FullItemList = CollectionViewSource.GetDefaultView(_itemList);
            Load();
        }
    
        private ObservableCollection<Res_details> _itemList { get; set; }
        public ICollectionView FullItemList { get; private set; }
    
        private void Load()
        {
            var items = new ObservableCollection<Res_details>();
            using (var db = new Access5687DB())
            {
                var q =
                    from c in db.Residents
                    select c;
                foreach (var c in q)
                {
                    items.Add(new Res_details()
                    {
                        ID = c.Room,
                        Name = c.Firstname,
                        LastName = c.Lastname,
                        Birthday = c.Birthday,
                        Arrival = c.Admission,
                    });
                }
                _fullItemList = items;
            }
        }
    
        /*Apply filter to the collection view*/
        private void ShowEmptyLinesOnly(object parameter)
        {
            /*logic based on your parameter here*/
    
    
            FullItemList.Filter = FilterEmptyLine;//<-- set filter to collection view
            FullItemList.Refresh();
        }
    
        private bool FilterEmptyLine(object o)
        {
            var item = o as Res_details;
            if (item == null) return false;
    
            /*
             * decide if item is 'empty' and return true in case item is empty;
             */
        }
    
        private ICommand filter_Empty;
        public ICommand Filter_Empty
        {
            get { if (filter_Empty == null) filter_Empty = new FilterObs(ShowEmptyLinesOnly); return filter_Empty; }
            set { filter_Empty = value; }
        }
    
        private class FilterObs : ICommand
        {
            public event EventHandler CanExecuteChanged;
            private readonly Action<object> _filterAction;
    
            public FilterObs(Action<object> filterAction)
            {
                _filterAction = filterAction;
            }
    
            public bool CanExecute(object parameter)
            {
                if ((string)parameter == "B")
                    return
                        true;
                if ((string)parameter != "B")
                    return
                        false;
                else
                    return
                        false;
            }
    
            public void Execute(object parameter)
            {
                _filterAction.Invoke(parameter);
            }
        }
    }
    
        2
  •  1
  •   SledgeHammer    7 年前