我正在寻找一种以非常丑陋的方式自动更新绑定数据网格的正确方法"。我有一个带有数据网格的wpf应用程序,我绑定到数据表:
MeasurementResultsDataGrid.ItemsSource = _main.CurrentMeasurement.MeasurementDataTable.AsDataView();
非常简单!接下来是我使用接口INotifyPropertyChanged
将模型与UI同步:
public event PropertyChangedEventHandler PropertyChanged;
public MeasurementDataSet.MeasurementDataTable MeasurementDataTable
{
get
{
return _measurementDataTable;
}
set
{
_measurementDataTable = value;
NotifyPropertyChanged("MeasurementDataTable");
}
}
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
一个线程正在向数据表中添加新行,并且不会给出任何错误。有点预期,DataGrid没有更新/"刷新"当线程更新表。做这个的最好方式是什么?我宁愿不使用单独的计时器/线程来更新datagrid:datagrid.refresh(); &安培; datagrid rebind ..
我已经对此进行了大量搜索,看起来我正走在正确的轨道上,但我想到了一些关键部分!
答案 0 :(得分:0)
首先,不要绑定到方法的返回值,因为返回值会被复制并且永远不会改变。
将ItemsSource绑定到实现 INotifyPropertyChanged 的类型的属性。 在您的情况下,我建议使用 ObservableCollection 。如果存储在集合中的项目正在实现INotifyPropertyChanged并且更改了更新UI,则无需调用 refresh()或 rebind()。
答案 1 :(得分:0)
您可以添加一个属性:
public DataView MeasurementDataTableView
{
get
{
return MeasurementDataTable.AsDataView();
}
}
然后使用它作为ItemsSource(不确定这是否可行,如果没有,我认为您可以使用绑定设置XAML代码):
MeasurementResultsDataGrid.SetBinding(DataGrid.ItemsSourceProperty, "MeasurementDataTableView") ;
这样您就可以在向数据表中添加新行后添加NotifyPropertyChanged("MeasurementDataTableView")
。
答案 2 :(得分:0)
经过长时间的搜索和尝试建议的答案后,我已经实现了@ coder0815答案的第二部分,并使用了Observable Collection而不是DataTable。看来现在我不必实现INotifyCollectionChanged接口,UI会自动更新!
如果您在UI线程上创建了集合,那么请注意是否尝试更新集合,这在WPF中大部分时间都会发生。在WPF中< 4.5你必须使用委托来超越"这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection"例外。如果你有WPF> 4.5,您可以使用以下内容:
在UI线程上创建一个变量,例如:
private SynchronizationContext _uiContext;
在创建UI时,初始化值:
_uiContext = SynchronizationContext.Current;
现在,您可以使用以下方法轻松更新集合:
_uiContext.Send(x => YOUR_METHOD(),null);
用你在集合上的方法替换YOUR_METHOD!