C# WPF Datagrid 在集合更改后不更新

C# WPF Datagrid does not update after collection change

几天来我一直在努力解决这个问题,但似乎无法接近解决它,这让我来到这里。

我正在处理一个 MVVM WPF 项目,我正在尝试使用数据绑定填充我的数据网格。

我面临的问题是,当我更改 ObservableCollection mGießformenFinal 时,我的数据网格没有更新。当我单击我的 GUI 上的按钮时,findCombinations() 方法 returns 项从我的数据库到集合。但即使 ObservableCollection 充满了项目,它们也不会在我的数据网格上更新。 当我在 viewModel.cs 的构造函数中调用 findCombinations() 时,table 在程序开始时被填充。

有很多我已经尝试过的东西。我想在这里列出一些:

GUI 的最终目标是提供一个搜索字段 + 按钮,以将我的数据库中的内容放入数据网格中。

有人知道我在这里遗漏了什么吗?

View.xaml

        <Grid Grid.Row="2" Grid.Column="2" Margin="0,0,0,0">
            <DataGrid Name="combinationJobOutput" AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding mGießformenFinal, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Grundplatte" Binding="{Binding Grundplatte}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Einlegeplatte" Binding="{Binding Einlegeplatte}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Fuehrungsring" Binding="{Binding Fuehrungsring}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Innenkern" Binding="{Binding Innenkern}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Cupform" Binding="{Binding Cupform}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>

View.xaml.cs

public partial class AnsichtZwei : UserControl
    {
        private SuchenViewModel ViewModel { get; set; }

        public AnsichtZwei()
        {
            InitializeComponent();
            this.DataContext = new SuchenViewModel();
        }
    }

ViewModel.cs

class SuchenViewModel : ObservableObject
    {
        public ObservableCollection<ModularMold> mGießformenFinal { get; set; } = new ObservableCollection<ModularMold>();

        public int productId { get; set; }

        public ICommand searchCommand { get; set; }

        public SuchenViewModel()
        {
            searchCommand = new SearchCommand(this);
        }

        public void findCombinations()
        {
            CombinationJob cj = new CombinationJob(productId);
            cj.FiltereDiscDB();
            this.mGießformenFinal = cj.KombiniereMGießformen();
        }
    }

SearchCommand.cs

internal class SearchCommand : ICommand
    {
        #region Constructors

        public SearchCommand(SuchenViewModel viewModel)
        {
            _viewModel = viewModel;
        }

        private SuchenViewModel _viewModel;

        #endregion Constructors

        #region ICommand Members

        public event System.EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            _viewModel.findCombinations();
        }

        #endregion ICommand Members
    }

问题的根源在这里

public ObservableCollection<ModularMold> mGießformenFinal { get; set; } = new ObservableCollection<ModularMold>();

 public void findCombinations()
 {
     CombinationJob cj = new CombinationJob(productId);
     cj.FiltereDiscDB();
     this.mGießformenFinal = cj.KombiniereMGießformen();
 }

这应该是

public ObservableCollection<ModularMold> mGießformenFinal { get; } = new ObservableCollection<ModularMold>();

 public void findCombinations()
 {
     CombinationJob cj = new CombinationJob(productId);
     cj.FiltereDiscDB();


     this.mGießformenFinal.Clear();

     foreach(var item in cj.KombiniereMGießformen()){
         this.mGießformenFinal.Add(item);
     }
 }

这是因为当您调用添加、删除、清除或插入时会触发 CollectionChanged 事件,指示 DataGrid 更新其项目源,当您直接替换集合时不会引发任何事件并且视图不知道一切都变了

您还可以使用 CollectionView 来过滤集合而不是实际编辑它

另一个小调整

ItemsSource="{Binding mGießformenFinal, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

应该是

ItemsSource="{Binding mGießformenFinal, Mode=OneWay}"

DataGrid 不会直接修改集合,两种编辑方式都是按列