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

4
我有一个绑定到 ViewModel 中的 ObservableCollection 的 DataGrid。这是一个搜索结果 DataGrid。问题在于,当我更新搜索结果 ObservableCollection 后,实际的 DataGrid 没有更新。
在我被投票降级之前,请注意这不是关于列中的数据(绑定完美工作),而是关于清除并将全新数据放入 ObservableCollection 而没有更新 DataGrid。因此,像这样链接到某个内容将无法帮助我,因为我的属性正常工作。
背景:
ObservableCollection 在 ViewModel 中声明如下:
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具有正确的数据,因为如果我在页面上放置一个按钮,并在单击事件中放置此代码;
private void selectPromoButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    var vm = (MyViewModel)DataContext;
    MyDataGrid.ItemsSource = vm.SearchCollection;
}
< p > DataGrid现在可以正确显示结果。

我知道我可以在页面的代码后台中放置一些事件,但那样做不是违背了MVVM吗?处理这个问题的正确MVVM方式是什么?

2个回答

4
尝试在你的模型视图中实现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"); }
    }

}

3
问题在于你重置了SearchCollection属性而不是更新集合。Observable collection会在列表中添加,删除或更新项目时引发正确的更改事件。但是在更改集合属性本身时不会引发任何更改事件。
在你的SearchCollection setter中,可以触发PropertyChanged事件,就像当任何其他属性发生变化时一样。同时确保DataGrid ItemsSource绑定是单向的而不是单次的。
<DataGrid  ItemsSource="{Binding SearchCollection, Mode=OneWay}" />

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接