2017-04-05 104 views
0

我的中有一个,它与ObservableCollection绑定。这是一个搜索结果DataGrid。问题是,我更新搜索结果ObservableCollection后,实际DataGrid未更新。WPF ObservableCollection在创建新的ObservableCollection时未更新DataGrid

之前,我得到了投什么,请注意这不是关于在列中的数据(即绑定完美的作品)有关清除,然后把完全新的数据到ObservableCollection未更新DataGridSo linking to something like this will not help as my properties are working correctly

背景:

ObservableCollectionViewModel这样被声明;

public ObservableCollection<MyData> SearchCollection { get; set; } 

绑定到我的搜索ObservableCollection这样的搜索DataGrid;

<DataGrid ItemsSource="{Binding SearchCollection}" /> 

ViewModel我有一个像这样的搜索方法;

var results = 
     from x in MainCollection 
     where x.ID.Contains(SearchValue) 
     select x; 
SearchCollection = new ObservableCollection<MyData>(results); 

该方法正确激发并产生所需结果。然而DataGrid没有更新新的结果。我知道ViewModel具有正确的数据,因为如果我在页面上放置按钮并在click事件中放置此代码;

private void selectPromoButton_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    var vm = (MyViewModel)DataContext; 
    MyDataGrid.ItemsSource = vm.SearchCollection; 
} 

DataGrid现在可以正确显示结果。

我知道我可以把一些事件放在页面后面的代码中,但是不会打败MVVM吗?什么是正确的MVVM方式来处理这个问题?

回答

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

} 
2

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

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

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

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

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

相关问题