如何通过绑定到复选框来过滤表项?

时间:2012-08-30 03:39:15

标签: c# wpf mvvm

我有一些表(使用ListView),我想在表中显示一些对象(make filter),如果选中了一些复选框....(如果未选中复选框,我想显示所有表项)

我怎样才能使用mvvm?我不能使用xaml背后的.cs文件。

由于

2 个答案:

答案 0 :(得分:2)

您可以在ViewModel中绑定复选框的IsChecked属性。在prpoperty setter中,您可以过滤收集到ListView的集合。

<强> XAML:

<CheckBox IsChecked="{Binding IsChecked}"/>

<强>视图模型:

private bool _isChecked;
public bool IsChecked
{
   get
   {
     return _isChecked; 
   }
   set
   {
     _isChecked = value;
     //filer your collection here
   }
}

答案 1 :(得分:2)

这里有一个小例子如何运作

在您的xaml上的

代码,绑定到FilterItems属性

<CheckBox Content="should i filter the view?" IsChecked="{Binding FilterItems}" />
<ListView ItemsSource="{Binding YourCollView}" />
在您的模型视图中使用

代码

public class MainModelView : INotifyPropertyChanged
{
    public MainModelView()
    {
        var coll = new ObservableCollection<YourClass>();
        yourCollView = CollectionViewSource.GetDefaultView(coll);
        yourCollView.Filter += new Predicate<object>(yourCollView_Filter);
    }

    bool yourCollView_Filter(object obj)
    {
        return FilterItems
            ? false // now filter your item
            : true;
    }

    private ICollectionView yourCollView;
    public ICollectionView YourCollView
    {
        get { return yourCollView; }
        set
        {
            if (value == yourCollView) {
                return;
            }
            yourCollView = value;
            this.NotifyPropertyChanged("YourCollView");
        }
    }

    private bool _filterItems;
    public bool FilterItems
    {
        get { return _filterItems; }
        set
        {
            if (value == _filterItems) {
                return;
            }
            _filterItems = value;
            // filer your collection here
            YourCollView.Refresh();
            this.NotifyPropertyChanged("FilterItems");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName)
    {
        var eh = PropertyChanged;
        if (eh != null) {
            eh(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

修改 完整示例位于here

希望有所帮助