c# - WPF ObservableCollection 在创建新的 ObservableCollection 时不更新 DataGrid

标签 c# wpf mvvm

我有一个 DataGrid,它绑定(bind)到 ViewModel 中的一个 ObservableCollection。这是一个搜索结果DataGrid。问题是,在我更新搜索结果 ObservableCollection 之后,实际的 DataGrid 没有更新。

在我投反对票之前,请注意这不是关于列中的数据(绑定(bind)工作完美)它是关于清除然后放置全新的数据到不更新 DataGridObservableCollectionSo linking to something like this will not help as my properties are working correctly

背景:

ObservableCollectionViewModel 中声明如下;

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

像这样绑定(bind)到我的搜索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;
}

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

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

最佳答案

尝试在您的模型 View 中实现 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"); }
    }

}

关于c# - WPF ObservableCollection 在创建新的 ObservableCollection 时不更新 DataGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43237054/

相关文章:

c# - 在 C# 应用程序中使用现有的 C++ 代码

c# - 从引用的回复中解析电子邮件内容

.net - MouseEventArgs.GetPosition 在 WPF 中没有按预期工作

c# - MVVM 将一个 ComboBox 与另一个绑定(bind)

c# - 如何让 Reactive Commands 观察它们自己的 IsExecuting observable

silverlight - 在没有服务架构的情况下使用Silverlight

c# - 异步/等待与 Task.Run 在 C# 中

c# - Android 上的 .NET 框架

c# - 如果以前的记录在 ItemsSource 集合中没有匹配项,则 WPF ComboBox 绑定(bind)有效,如果有则失败

wpf - INotifyPropertyChanged 不会导致此代码中的屏幕更新