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

问题描述 投票:0回答:2

我已经尝试解决这个问题好几天了,但似乎无法接近解决它,这让我来到这里。

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

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

我已经尝试过很多事情。我想在这里列出一些:

  • 执行函数后手动向 ObservableCollection 添加一个对象以触发属性更改
  • 将方法调用( findCombinations() )放在后面的代码中
  • 使用 datagrid.items.refresh()

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

有人知道我在这里缺少什么吗?

查看.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
    }
c# wpf mvvm datagrid
2个回答
0
投票

你问题的根源就在这里

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 来过滤 Collection,而不是实际编辑它

另一个小调整

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

应该是

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

因为 DataGrid 不会直接修改集合,所以两种方式的编辑是通过列进行的


0
投票

谢谢你。我遇到了完全相同的问题。

© www.soinside.com 2019 - 2024. All rights reserved.