WPF ObservableCollection在创建新的ObservableCollection时不更新DataGrid

时间:2017-04-05 16:44:15

标签: c# wpf mvvm

我有一个DataGridObservableCollection中的ViewModel绑定。这是搜索结果DataGrid。问题是,在我更新搜索结果ObservableCollection后,实际的DataGrid未更新。

在我拒绝投票之前,请注意这不是关于列中的数据(绑定工作完美)关于清算然后放置全新未更新ObservableCollection的{​​{1}}数据。 So linking to something like this will not help as my properties are working correctly

背景:

DataGridObservableCollection中声明为{/ 1}};

ViewModel

与我的搜索public ObservableCollection<MyData> SearchCollection { get; set; } 绑定的搜索DataGrid;

ObservableCollection

<DataGrid ItemsSource="{Binding SearchCollection}" /> 我有这样的搜索方法;

ViewModel

该方法正确触发并产生所需的结果。但var results = from x in MainCollection where x.ID.Contains(SearchValue) select x; SearchCollection = new ObservableCollection<MyData>(results); 未使用新结果进行更新。我知道DataGrid具有正确的数据,因为如果我在页面上放置一个按钮并在click事件中放置此代码;

ViewModel

private void selectPromoButton_Click(object sender, System.Windows.RoutedEventArgs e) { var vm = (MyViewModel)DataContext; MyDataGrid.ItemsSource = vm.SearchCollection; } 现在可以正确显示结果。

我知道我可以在页面后面的代码中添加一些事件但是不会击败MVVM吗?什么是正确的MVVM处理方式?

2 个答案:

答案 0 :(得分:3)

尝试在模型视图中实施INotifyPropertyChanged

示例:

public abstract class ViewModelBase : INotifyPropertyChanged {

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
    {
        var handler = PropertyChanged;
        handler?.Invoke(this, args);
    }
}

public class YourViewModel : ViewModelBase {

    private ObservableCollection<MyData> _searchCollection ;

    public ObservableCollection<MyData> SearchCollection 
    {
        get { return _searchCollection; }
        set { _searchCollection = value; OnPropertyChanged("SearchCollection"); }
    }

}

答案 1 :(得分:2)

问题是您正在重置SearchCollection属性而不是更新集合。当添加,删除或更新列表中的项目时,Observable collection会引发正确的更改事件。但是当集合属性本身发生变化时却不会。

在SearchCollection设置器中,您可以触发PropertyChanged事件。就像任何其他财产改变时一样。还要确保您的DataGrid ItemsSource绑定是单向的,而不是一次性的。

<DataGrid  ItemsSource="{Binding SearchCollection, Mode=OneWay}" />

或者您可以更改集合的成员(清除旧结果并添加新结果)。这也应该像你期望的那样更新DataGrid。

从你的代码示例中,我会选择第一个选项。