【发布时间】:2017-02-09 11:06:24
【问题描述】:
这与其说是我坚持的问题,不如说是一个关于是否有更好方法的问题。它按现在的方式工作,但如果可以的话,我想更好地理解。
为什么我在使用ObservableCollection<T>进行绑定时总是要更新DataGrid.ItemSource?
我正在使用以下代码将ObservableCollection<T> 绑定到DataGrid。
public partial class MainWindow : INotifyPropertyChanged
{
public MainWindow()
{
DataContext = this;
InitializeComponent();
CalcObservable =
DatabaseQueries.ShiftInputSourceObserv(SelectedEmployee.Key, DateFilter);
MyDataGrid.ItemsSource = CalcObservable;
}
public ObservableCollection<CalcTable> CalcObservable { get; set; }
= new ObservableCollection<CalcTable>();
}
这是从数据库中获取数据的函数,
internal class DatabaseQueries
{
public static ObservableCollection<CalcTable> ShiftInputSourceObserv(int staffNo, DateTime date)
{
using (DatabaseDataContext dataContext = new DatabaseDataContext(MainWindow.InstanceConnectionString))
{
return new ObservableCollection<CalcTable>
(dataContext.CalcTables.Where(
p => p.Staff_No == staffNo &&
p.Year_No == date.Year &&
p.Month_No == date.Month)
.OrderBy(p => p.Column_Index));
}
}
}
然后我使用ComboBox 更改事件来更新ObservableCollection<T>。 SelectedEmployee.Key 绑定到 ComboBox 并在选择时更改所选员工:
private void NumbersComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
CalcObservable =
DatabaseQueries.ShiftInputSourceObserv(SelectedEmployee.Key, DateFilter);
MyDataGrid.ItemsSource = CalcObservable;
}
我的印象是更改ObservableCollection<T> 会更新而无需 必须再次使用MyDataGrid.ItemsSource = CalcObservable; 行?
感谢您的帮助。
【问题讨论】:
-
不是新实例吗?
-
不要分配给
NumbersComboBox_SelectionChanged中的CalcObservable,而是尝试清除现有集合并将DatabaseQueries.ShiftInputSourceObserv的返回值中的项目添加到现有集合中(即CalcObservable)跨度> -
ObservableCollection将在您添加/删除项目时通知 UI。但是你正在做的是创建一个新实例 -
@Pikoh,这就是我的怀疑。那么我需要清除集合并以这种方式添加数据吗?
-
在
CalcObservable上实现INotifyPropertyChanged并从 DataContext 绑定它,而不是在构造函数中分配它
标签: c# wpf data-binding observablecollection