Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在组合框更改时更改ObservableCollection_C#_Wpf_Data Binding_Observablecollection - Fatal编程技术网

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));
    }
}