Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WPF MVVM在datagrid上进行过滤,它可以工作,但我不&x27;我不知道为什么_C#_Wpf_Datagrid - Fatal编程技术网

C# 使用WPF MVVM在datagrid上进行过滤,它可以工作,但我不&x27;我不知道为什么

C# 使用WPF MVVM在datagrid上进行过滤,它可以工作,但我不&x27;我不知道为什么,c#,wpf,datagrid,C#,Wpf,Datagrid,问题是,昨天我想制作一个搜索栏来过滤数据网格。我成功地做到了这一点,但当我今天查看它时,我意识到我不知道它为什么会起作用。让我困惑的是: 基本上,我有一个datagrid,它的ItemsSource设置为一个称为Equipments的可观察集合。为了在设备上进行过滤,我还创建了一个名为EquipmentView的ICollectionView,它只是我可以进行过滤的设备的镜像 设备从我的数据库中的表填充到viewmodel中,如下所示: public async Task LoadAsync(

问题是,昨天我想制作一个搜索栏来过滤数据网格。我成功地做到了这一点,但当我今天查看它时,我意识到我不知道它为什么会起作用。让我困惑的是:

基本上,我有一个datagrid,它的ItemsSource设置为一个称为Equipments的可观察集合。为了在设备上进行过滤,我还创建了一个名为EquipmentView的ICollectionView,它只是我可以进行过滤的设备的镜像

设备从我的数据库中的表填充到viewmodel中,如下所示:

 public async Task LoadAsync()
    {
        try
        {
            var lookup = await _equipmentLookupDataService.GetEquipmentLookupAsync();
            Equipments.Clear();
            foreach (var item in lookup)
            {
                Equipments.Add(item);
            }
            EquipmentView = CollectionViewSource.GetDefaultView(Equipments);
            EquipmentView.Filter = new Predicate<object>(Filter);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message, "An error occurred", MessageBoxButton.OK, MessageBoxImage.Warning);
            //create new error object from the exception and add to DB
            Error error = new Error
            {
                ErrorMessage = e.Message,
                ErrorTimeStamp = DateTime.Now,
                ErrorStackTrace = e.StackTrace,
                LoginId = CurrentUser.LoginId
            };
            await _errorDataService.AddError(error);
        }
    }
只有当TypeName属性以filterstring开头时,它才返回true,filterstring是绑定到我的搜索栏的字符串

现在我想我只需要将datagrid ItemsSource设置为EquipmentView。如果我这样做,一切都正常,datagrid只显示与搜索栏匹配的内容

显然,如果我将datagrid上的itemsSource设置回设备,它仍然可以工作,包括搜索栏。为什么会这样?据我所知,设备视图上的过滤不应该改变任何有关设备的内容,但它似乎无论如何都会这样做

一切都很好真的,我只是希望我知道为什么

还有搜索栏的XAML代码:

<TextBox Name="SearchBar" Margin="10 10 10 10" Text="{Binding FilterString, UpdateSourceTrigger=PropertyChanged}"/>

数据网格:

        <DataGrid MaxHeight="800"
            ItemsSource="{Binding Equipments}"
            SelectedItem="{Binding SelectedEquipment, Mode=TwoWay}"
            IsReadOnly="True"
            CanUserReorderColumns="False"
            SelectionMode="Single"
            ColumnWidth="*">
            <DataGrid.ItemContainerStyle>
                <Style TargetType="DataGridRow">
                    <EventSetter Event="MouseDoubleClick"
                     Handler="Row_DoubleClick" />
                </Style>
            </DataGrid.ItemContainerStyle>
        </DataGrid>


来自WPF文档:

所有集合都有默认的CollectionView。WPF总是绑定到 视图而不是集合。如果直接绑定到集合, WPF实际上绑定到该集合的默认视图。这 默认视图由集合的所有绑定共享,这会导致 所有直接绑定到集合以共享排序、筛选、, 组和一个默认视图的当前项特征

现在,在代码中,您正在执行以下操作:

EquipmentView = CollectionViewSource.GetDefaultView(Equipments);
EquipmentView.Filter = new Predicate<object>(Filter);
EquipmentView=CollectionViewSource.GetDefaultView(设备);
EquipmentView.Filter=新谓词(Filter);

来自WPF文档:

所有集合都有默认的CollectionView。WPF总是绑定到 视图而不是集合。如果直接绑定到集合, WPF实际上绑定到该集合的默认视图。这 默认视图由集合的所有绑定共享,这会导致 所有直接绑定到集合以共享排序、筛选、, 组和一个默认视图的当前项特征

现在,在代码中,您正在执行以下操作:

EquipmentView = CollectionViewSource.GetDefaultView(Equipments);
EquipmentView.Filter = new Predicate<object>(Filter);
EquipmentView=CollectionViewSource.GetDefaultView(设备);
EquipmentView.Filter=新谓词(Filter);

绑定到集合时,WPF实际上绑定到该集合的默认视图。视图只是一个包装器,允许您进行筛选、排序等。当您绑定到集合时,WPF实际上绑定到该集合的默认视图。视图只是一个包装器,允许您进行筛选、排序等。