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



我已经尝试解决这个问题好几天了,但似乎一点也解决不了,这把我带到了这里。

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

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

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

  • 在执行触发属性变化的函数后手动添加一个对象到ObservableCollection
  • 后面的代码中放置方法调用(findcombination ())使用datagrid.items.refresh ()

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直接修改的集合,两种编辑方式是通过

列进行编辑。

最新更新