我已经尝试解决这个问题好几天了,但似乎无法接近解决它,这让我来到这里。
我正在开发一个 MVVM WPF 项目,我正在尝试使用数据绑定填充我的数据网格。
我面临的问题是,当我更改 ObservableCollection mGießformenFinal 时,我的数据网格不会更新。当我单击 GUI 上的按钮时,findCombinations() 方法将项目从数据库返回到集合中。但即使 ObservableCollection 充满了项目,它们也不会在我的数据网格上更新。 当我在 viewModel.cs 的构造函数中调用 findCombinations() 时,该表在程序开始时就会被填满。
我已经尝试过很多事情。我想在这里列出一些:
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
}
你问题的根源就在这里
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 不会直接修改集合,所以两种方式的编辑是通过列进行的
谢谢你。我遇到了完全相同的问题。