使用 Caliburn micro 和 MVVM 时在列表视图中对项目进行分组

Grouping items in a listview when using Caliburn micro and MVVM

我是 MVVM 的新手。我用谷歌搜索了这个荒谬问题的废话,但找不到任何东西。

我的表单上有一个 Listview,我用数据库调用填充了它。没关系,但我想通过名为 Status.属性 的 属性 对列表视图中的项目进行分组。

通常这不会有问题,我会在绑定数据后向控件添加一个 PropertyGroupDescription,但是 MVVM 方面的事情妨碍了。

当我在视图模型中设置数据 属性 时,我无法在控件上设置 PropertyGroupDescription,因为我无法在 ViewModel 中访问它。

我无法在 xaml 代码隐藏中设置它,因为当数据更改时我无法触发任何事件。

我知道对于你们这些知情人士来说,这可能是一个简单得可笑的问题,但我觉得我在用头撞墙,所以我实际上创建了一个 Whosebug 帐户 :)

viewModel代码

    class SearchViewModel : Screen
    {
        private BindableCollection<Claim> _searchResults;
        private string _searchString;
            
        public string SearchString
        {
            get { return _searchString; }
            set { _searchString = value; }
        }

        public BindableCollection<Claim> SearchResults
        {
            get { return _searchResults; }
            set 
            {
                _searchResults = value;
                NotifyOfPropertyChange(() => SearchResults); 
            }
        }

        public async void DoSearch()
        {
            List<Claim> results = await AugmentorCore.Search.SearchTelephones(SearchString);
            SearchResults = new BindableCollection<Claim>(results);
        }

        public void SearchBoxKeyDown(ActionExecutionContext context)
        {
            KeyEventArgs keyArgs = context.EventArgs as KeyEventArgs;
            if (keyArgs.Key == Key.Enter)
                DoSearch();
        }
        public void SearchResultsUpdated(ActionExecutionContext context)
        {
            // Trying to get an event on the control to fire this.
            //ListView source = context.Source as ListView;
            //CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(source.ItemsSource);
            //PropertyGroupDescription groupDescription = new PropertyGroupDescription("status");
            //view.GroupDescriptions.Add(groupDescription);
            MessageBox.Show("In SearchResultsUpdated");
        }
    }

XAML(缩写)

                <ListView
                    DockPanel.Dock="Top"
                    x:Name="SearchResults">
                    
                    <ListView.View>
                        <GridView>
                            <GridViewColumn 
                                Header="Case/Name"
                                Width="150" 
                                DisplayMemberBinding="{Binding reference}"/>
                        </GridView>
                    </ListView.View>
                    
                                        
                    <ListView.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.HeaderTemplate>
                                <DataTemplate>
                                    <TextBlock FontWeight="Bold" FontSize="14" Text="{Binding Name}"/>
                                </DataTemplate>
                            </GroupStyle.HeaderTemplate>
                        </GroupStyle>
                    </ListView.GroupStyle>
                </ListView>

希望我已经正确理解了您的问题。您可以执行以下操作。

<ListView ItemsSource="{Binding}">
            <ListBox.DataContext>
                <CollectionViewSource Source="{Binding SearchResults}" >
                    <CollectionViewSource.GroupDescriptions>
                        <PropertyGroupDescription PropertyName="Status" />
                    </CollectionViewSource.GroupDescriptions>
                </CollectionViewSource>
            </ListBox.DataContext>

....
...
</ListView>