【问题标题】:Change out ObservableCollection upon ComboBox change在 ComboBox 更改时更改 ObservableCollection
【发布时间】: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&lt;T&gt;SelectedEmployee.Key 绑定到 ComboBox 并在选择时更改所选员工:

 private void NumbersComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
 { 
      CalcObservable = 
         DatabaseQueries.ShiftInputSourceObserv(SelectedEmployee.Key, DateFilter);

      MyDataGrid.ItemsSource = CalcObservable;
 }

我的印象是更改ObservableCollection&lt;T&gt; 会更新而无需 必须再次使用MyDataGrid.ItemsSource = CalcObservable; 行?

感谢您的帮助。

【问题讨论】:

  • 不是新实例吗?
  • 不要分配给NumbersComboBox_SelectionChanged中的CalcObservable,而是尝试清除现有集合并将DatabaseQueries.ShiftInputSourceObserv的返回值中的项目添加到现有集合中(即CalcObservable )跨度>
  • ObservableCollection 将在您添加/删除项目时通知 UI。但是你正在做的是创建一个新实例
  • @Pikoh,这就是我的怀疑。那么我需要清除集合并以这种方式添加数据吗?
  • CalcObservable 上实现 INotifyPropertyChanged 并从 DataContext 绑定它,而不是在构造函数中分配它

标签: c# wpf data-binding observablecollection


【解决方案1】:

我正在使用以下代码将ObservableCollection&lt;T&gt; 绑定到DataGrid ...

不,你不绑定它。您将ItemsSource 属性设置为CalcObservable 属性的值。

然后,您在NumbersComboBox_SelectionChanged 事件处理程序中将CalcObservable 属性设置为 ObservableCollection&lt;T&gt;。这不会以某种方式自动更新DataGridItemsSource 属性。

如果你真的绑定CalcObservable属性,你可以刷新DataGrid,前提是你的类实现了INotifyPropertyChanged接口并且你在setter中引发PropertyChanged事件CalcObservable 属性:

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

另一种选择是清除ObservableCollection&lt;T&gt; 的现有实例并向其中添加新项目,而不是每次要更新DataGrid 时都创建一个新集合。

【讨论】:

  • 给我一点,我一直在尝试实现这一点。老实说,我有点过头了。您在数据网格上设置绑定的方式。
  • 是您以编程方式定义绑定的方式。您不妨在 XAML 标记中设置绑定:。但是您应该以编程方式设置 ItemsSource 属性,因为这样会清除您在 XAML 标记中定义的绑定。
  • 我已经解决了 cmets 的问题,但你的回答很有趣。如您所知,您只能使用一种OnPropertyChanged 方法,并且您显示的方法不允许我的其他OnPropertyChanged 属性工作。你为什么这样设置ObservableCollection&lt;CalcTable&gt;?这不是旧方法吗,因为 ObservableCollection` 会自动实现INotifyPropertyChanged?我对您提供的帮助表示赞成,但我想更多地了解这个答案。
  • 我不太明白你的意思?关键是您应该将 ItemsSource 属性绑定到 CalcObservable 源属性。无论是在 XAML 标记中还是在 C# 代码中设置绑定都无关紧要。而 OnPropertyChanged 方法的实现实际上与此无关。只是像往常一样引发 PropertyChanged 事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2014-01-01
  • 1970-01-01
  • 2013-07-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多