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

问题描述

我对 MVVM 完全陌生。我用谷歌搜索了这个荒谬的问题,但找不到任何东西。

我的表单上有一个 Listview,我用 DB 调用填充了它。这一切都很好,但我想通过一个名为 Status 的属性对列表视图中的项目进行分组。

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

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

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

我知道这对于知情的人来说可能是一个非常简单的问题,但我觉得我在这里撞到了砖墙,以至于我实际上创建了一个 StackOverflow 帐户:)

视图模型代码

    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>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...