我有一个DataGrid
与ObservableCollection
中的ViewModel
绑定。这是搜索结果DataGrid
。问题是,在我更新搜索结果ObservableCollection
后,实际的DataGrid
未更新。
在我拒绝投票之前,请注意这不是关于列中的数据(绑定工作完美)它关于清算然后放置全新未更新ObservableCollection
的{{1}}数据。 So linking to something like this will not help as my properties are working correctly
背景:
DataGrid
在ObservableCollection
中声明为{/ 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处理方式?
答案 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。
从你的代码示例中,我会选择第一个选项。