所以我DataGrid
中有一个UserControl
。它是数据绑定到My ViewModel中的observable collection
。 ViewModel实现了INotifyPropertyChanged
接口,并已在视图中正确连接。
在我看来:
<DataGrid AutoGenerateColumns="False"
EnableRowVirtualization="True"
ItemsSource="{Binding ContributionCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<!-- DataGrid rows -->
/>
在ViewModel中:
private ObservableCollection<contribution> _contributionCollection;
public ObservableCollection<contribution> ContributionCollection
{
get
{
return _contributionCollection;
}
set
{
_contributionCollection= value;
OnPropertyChanged("ContributionCollection");
}
}
意味着什么,是的;只需单击特定按钮,查询就会触发数据库并返回一些结果。这些结果意味着在Datagrid中显示。
// Fired by an ICommand Property
public object Contributions_CommandExecute(object param)
{
var queryContributions = context.contributions.Where(c => c.member == Member);
return _contributionCollection = new ObservableCollection<contribution>(queryContributions);
}
但是数据网格总是空着。应用程序冻结了一点,表明在后台发生了一些事情,但实际上没有在视图上传达任何内容。事实上,它唯一正常工作的时候,是ViewModel构造函数在初始化时触发查询。但在那之后,它又不会再开火了。
知道我哪里出错了吗?
答案 0 :(得分:1)
这一行
return _contributionCollection = new ObservableCollection<contribution>(queryContributions);
仅更新字段值。由于它没有使用属性设置器,因此不会调用OnPropertyChanged("ContributionCollection");
解决方案是使用属性(顺便说一句,为什么方法不是无效的?)
// Fired by an ICommand Property
public void Contributions_CommandExecute(object param)
{
var queryContributions = context.contributions.Where(c => c.member == Member);
ContributionCollection = new ObservableCollection<contribution>(queryContributions);
}
答案 1 :(得分:1)
查看
<DataGrid AutoGenerateColumns="False"
EnableRowVirtualization="True"
ItemsSource="{Binding ContributionCollection}">
<!-- DataGrid rows -->
/>
视图模型
public void Contributions_CommandExecute(object param)
{
ContributionCollection = new ObservableCollection<contribution>(context.contributions.Where(c => c.member == Member));
}
答案 2 :(得分:0)
你必须使用Dispatcher更新列表,这样就不会像这样中断GUI:
Dispatcher.BeginInvoke(new Action(() => _contributionCollection = new ObservableCollection<contribution>(queryContributions)));
我遇到了类似的问题: