C# 根据MVVM中集合的更改调整listview列的大小

C# 根据MVVM中集合的更改调整listview列的大小,c#,wpf,listview,mvvm,gridviewcolumn,C#,Wpf,Listview,Mvvm,Gridviewcolumn,这是我第一次在这里发布问题,如果我在问题中遗漏了什么,或者我没有提供足够的细节,请提前道歉 首先,我在这篇文章中发现了一个非常类似的问题,它非常清楚地描述了我试图实现的目标: 然而,声誉限制不允许我发表评论,因此我提出了这个问题 关于我的具体问题: 我第一次构建了一个WPF应用程序,并试图对MVVM模式有所了解。在我看来,我有一个带有gridview的listView。listview的ItemSource绑定到my ViewModel中的ICollectionView,它的“Collectio

这是我第一次在这里发布问题,如果我在问题中遗漏了什么,或者我没有提供足够的细节,请提前道歉

首先,我在这篇文章中发现了一个非常类似的问题,它非常清楚地描述了我试图实现的目标: 然而,声誉限制不允许我发表评论,因此我提出了这个问题

关于我的具体问题:

我第一次构建了一个WPF应用程序,并试图对MVVM模式有所了解。在我看来,我有一个带有gridview的listView。listview的ItemSource绑定到my ViewModel中的ICollectionView,它的“CollectionViewSource”根据用户选择的植物类别用不同的ObservableCollections更新。 可观察集合根据用户输入的搜索查询从本地数据库获取数据

我的问题是,用户第一次输入搜索输入时,列表中会填充结果,并且会调整每个gridviewcolumns的宽度,以适合每列中最长的字符串

但是,当用户输入另一个搜索查询时,我更新了可观察集合,gridviewcolumns的宽度不会调整以适应新数据,因此宽度将保持第一个搜索查询的结果设置的宽度

我希望能够动态地设置每列的宽度,以适应该列中最长的元素,但我无法在不破坏MVVM模式的情况下思考如何正确地执行此操作

在前面提到的帖子中提出的解决方案建议编辑我的xaml.cs文件,据我所知,这不应该在MVVM中完成,因为视图的代码隐藏文件不应该包含任何逻辑。 根据我的理解,正确的方法是公开viewmodel上的属性,然后通过xaml绑定到视图中的这些属性

我的天真方法是在ViewModel中公开Width属性,但是,由于我的视图中有多个列,我需要公开每个列的Width属性,并通过迭代新获取的结果中的每个对象来重新计算这些属性的宽度,并找到其中最长的字符串,这看起来既乏味又错误

所以我的问题基本上是: 更新viewmodel中的ItemSource时,如果viewmodel不知道该视图,则重新计算视图中gridviewcolumns的宽度的最佳方法是什么

我应该在viewmodel中公开宽度的属性,还是可以在viewmodel中引发事件并在视图中订阅该事件? 在此方面的任何帮助或提示都将不胜感激

以下是我的listview的xaml代码:


以及ViewModel:


public ParentMenuViewModel(DataStore ds)
{            
            IBarleyDatabaseDAO db = BarleyDatabaseMysqlDAO.Instance;
            this.ds = ds;

            DHPlants = ds.DHPlants;
            DonorPlants = ds.DonorPlants;
            BreedersReferencePlants = ds.BreedersReferencePlants;
            ElitePlants = ds.ElitePlants;
            DMIPlants = ds.DMIPlants;

            _activeView = CollectionViewSource.GetDefaultView(new List<Plant>());            
}


 ICollectionView _activeView;
        public ICollectionView ActiveView
        {
            get
            {
                return _activeView;
            }
            set
            {
                if (_activeView != value)
                {
                    _activeView = value;
                    _activeView.SortDescriptions.Clear();
                    _activeView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
                    OnPropertyChanged("ActiveView");
                }
            }
        }

 ObservableCollection<Plant> _activeList;
        public ObservableCollection<Plant> ActiveList
        {
            get { return _activeList; }
            set
            {
                if (_activeList != value)
                {
                    _activeList = value;
                    ActiveView = CollectionViewSource.GetDefaultView(_activeList);

                    OnPropertyChanged("ActiveList");
                }
            }
        }


        public void UpdatePlants(string selectedPlantType)
        {
            if (!string.IsNullOrEmpty(Filter))
            {
                switch (selectedPlantType)
                {
                    case "CA":
                        ds.UpdatePlantList(PlantType.DH, Filter, Page * 100);
                        ActiveList = DHPlants;
                        break;

                    case "Donor":
                        ds.UpdatePlantList(PlantType.DONOR, Filter, Page * 100);
                        ActiveList = DonorPlants;
                        break;

                    case "DMI":
                        ds.UpdatePlantList(PlantType.DMI, Filter, Page * 100);
                        ActiveList = DMIPlants;                        
                        break;

                    case "Breeders Reference":
                                                ds.UpdatePlantList(PlantType.BREEDERS_REFERENCE_INTERNAL, Filter, Page * 100); 

                        ActiveList = BreedersReferencePlants;
                        break;

                    case "Elite":
                        ds.UpdatePlantList(PlantType.ELITE_INTERNAL, Filter, Page * 100); 
                        ActiveList = ElitePlants;
                        break;

                    default:
                        return;
                }
            }
            else
            {
                ds.ClearPlantCollecetions();
            }

        }

公共ParentMenuViewModel(数据存储ds)
{            
IBarleyDatabaseDAO db=BarleyDatabaseMysqlDAO.Instance;
这是1.ds=ds;
DHPlants=ds.DHPlants;
DonorPlants=ds.DonorPlants;
繁殖者参考植物=ds.繁殖者参考植物;
ElitePlants=ds.ElitePlants;
DMIPlants=ds.DMIPlants;
_activeView=CollectionViewSource.GetDefaultView(新列表());
}
ICollectionView\u activeView;
公共ICollectionView活动视图
{
得到
{
返回动态视图;
}
设置
{
如果(_activeView!=值)
{
_activeView=值;
_activeView.SortDescriptions.Clear();
_添加(新的SortDescription(“Name”,ListSortDirection.升序));
OnPropertyChanged(“ActiveView”);
}
}
}
ObservableCollection\u activeList;
公共ObservableCollection活动列表
{
获取{return\u activeList;}
设置
{
如果(_activeList!=值)
{
_活动列表=值;
ActiveView=CollectionViewSource.GetDefaultView(\u activeList);
OnPropertyChanged(“活动列表”);
}
}
}
public void UpdatePlants(字符串selectedPlantType)
{
如果(!string.IsNullOrEmpty(筛选器))
{
开关(选定的PlantType)
{
案例“CA”:
更新植物