C# 在组合框更改时更改ObservableCollection
这并不是一个我一直坚持的问题,而是一个关于是否有更好的方法的问题。它的工作原理是这样的,但如果可以的话,我想得到更好的理解 当我使用C# 在组合框更改时更改ObservableCollection,c#,wpf,data-binding,observablecollection,C#,Wpf,Data Binding,Observablecollection,这并不是一个我一直坚持的问题,而是一个关于是否有更好的方法的问题。它的工作原理是这样的,但如果可以的话,我想得到更好的理解 当我使用observedcollection进行绑定时,为什么总是要更新DataGrid.ItemSource 我正在使用下面的代码将ObservableCollection绑定到DataGrid public partial class MainWindow : INotifyPropertyChanged { public MainWindow() {
observedcollection
进行绑定时,为什么总是要更新DataGrid.ItemSource
我正在使用下面的代码将ObservableCollection
绑定到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>();
}
我的印象是,更改ObservableCollection
将更新,而不必使用MyDataGrid.ItemsSource=CalcObservable代码>行吗
谢谢你的帮助
我正在使用下面的代码将可观测集合
绑定到数据网格
不,你不用绑。将ItemsSource
属性设置为CalcObservable
属性的值
然后,在NumbersComboBox\u selection changed
事件处理程序中将CalcObservable
属性设置为新的observeCollection
。这不会以某种方式自动更新DataGrid
的ItemsSource
属性
如果确实绑定到CalcObservable
属性,则可以刷新DataGrid
,前提是类实现了INotifyPropertyChanged
接口,并且在CalcObservable
属性的setter中引发PropertyChanged
事件:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
DataContext = this;
InitializeComponent();
CalcObservable = DatabaseQueries.ShiftInputSourceObserv(SelectedEmployee.Key, DateFilter);
MyDataGrid.SetBinding(ComboBox.ItemsSourceProperty, new Binding(nameof(CalcObservable)) { Source = this });
}
private ObservableCollection<CalcTable> _calcObservable = new ObservableCollection<CalcTable>();
public ObservableCollection<CalcTable> CalcObservable
{
get { return _calcObservable; }
set { _calcObservable = value; OnPropertyChanged(nameof(CalcObservable)); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
public分部类主窗口:窗口,INotifyPropertyChanged
{
公共主窗口()
{
DataContext=this;
初始化组件();
CalcObservable=databasequerys.ShiftInputSourceObserv(SelectedEmployee.Key,DateFilter);
SetBinding(ComboBox.ItemsSourceProperty,新绑定(nameof(CalcObservable)){Source=this});
}
私有ObservableCollection_calcObservable=新ObservableCollection();
公共可观测集合CalcObservable
{
获取{return\u calcObservable;}
设置{u calcObservable=value;OnPropertyChanged(nameof(calcObservable));}
}
公共事件属性更改事件处理程序属性更改;
受保护的void OnPropertyChanged(字符串名称)
{
if(PropertyChanged!=null)
PropertyChanged(此,新PropertyChangedEventArgs(名称));
}
}
另一个选项是清除ObservableCollection
的现有实例,并向其添加新项,而不是在每次更新DataGrid时创建新集合
我正在使用下面的代码将可观测集合
绑定到数据网格
不,你不用绑。将ItemsSource
属性设置为CalcObservable
属性的值
然后,在NumbersComboBox\u selection changed
事件处理程序中将CalcObservable
属性设置为新的observeCollection
。这不会以某种方式自动更新DataGrid
的ItemsSource
属性
如果确实绑定到CalcObservable
属性,则可以刷新DataGrid
,前提是类实现了INotifyPropertyChanged
接口,并且在CalcObservable
属性的setter中引发PropertyChanged
事件:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
DataContext = this;
InitializeComponent();
CalcObservable = DatabaseQueries.ShiftInputSourceObserv(SelectedEmployee.Key, DateFilter);
MyDataGrid.SetBinding(ComboBox.ItemsSourceProperty, new Binding(nameof(CalcObservable)) { Source = this });
}
private ObservableCollection<CalcTable> _calcObservable = new ObservableCollection<CalcTable>();
public ObservableCollection<CalcTable> CalcObservable
{
get { return _calcObservable; }
set { _calcObservable = value; OnPropertyChanged(nameof(CalcObservable)); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
public分部类主窗口:窗口,INotifyPropertyChanged
{
公共主窗口()
{
DataContext=this;
初始化组件();
CalcObservable=databasequerys.ShiftInputSourceObserv(SelectedEmployee.Key,DateFilter);
SetBinding(ComboBox.ItemsSourceProperty,新绑定(nameof(CalcObservable)){Source=this});
}
私有ObservableCollection_calcObservable=新ObservableCollection();
公共可观测集合CalcObservable
{
获取{return\u calcObservable;}
设置{u calcObservable=value;OnPropertyChanged(nameof(calcObservable));}
}
公共事件属性更改事件处理程序属性更改;
受保护的void OnPropertyChanged(字符串名称)
{
if(PropertyChanged!=null)
PropertyChanged(此,新PropertyChangedEventArgs(名称));
}
}
另一个选项是清除ObservableCollection
的现有实例,并向其添加新项,而不是每次要更新DataGrid时都创建一个新集合。这不是一个新实例吗?而不是在NumbersComboBox\u SelectionChanged
中分配给CalcObservable
,尝试清除现有集合,并从数据库查询的返回值中添加项。ShiftInputSourceObserv
到现有集合(即,CalcObservable
)ObservableCollection
将在添加/删除项时通知UI。但你所做的是创造一个新的世界instance@Pikoh,这是我所怀疑的。因此,我需要清除集合并以这种方式添加数据?在CalcObservable
上实现INotifyPropertyChanged
,并从DataContext绑定它,而不是在构造函数中分配它,它不是一个新实例吗?而不是在NumbersComboBox\u SelectionChanged
中分配给CalcObservable
,尝试清除现有集合,并从数据库查询的返回值中添加项。ShiftInputSourceObserv
到现有集合(即,CalcObservable
)ObservableCollection
将在添加/删除项时通知UI。但你所做的是创造一个新的世界instance@Pikoh,这是我所怀疑的。因此,我需要清除集合并以这种方式添加数据?在CalcObservable
上实现INotifyPropertyChanged
,并从DataContext绑定它,而不是在c中分配它
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
DataContext = this;
InitializeComponent();
CalcObservable = DatabaseQueries.ShiftInputSourceObserv(SelectedEmployee.Key, DateFilter);
MyDataGrid.SetBinding(ComboBox.ItemsSourceProperty, new Binding(nameof(CalcObservable)) { Source = this });
}
private ObservableCollection<CalcTable> _calcObservable = new ObservableCollection<CalcTable>();
public ObservableCollection<CalcTable> CalcObservable
{
get { return _calcObservable; }
set { _calcObservable = value; OnPropertyChanged(nameof(CalcObservable)); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}