触发查询时数据网格不更新
Datagrid not updating when query is fired
所以我的 UserControl
中有一个 DataGrid
。它数据绑定到 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 构造函数在初始化时触发查询。但是之后就不会再火了
知道我哪里出错了吗?
这一行
return _contributionCollection = new ObservableCollection<contribution>(queryContributions);
仅更新字段值。因为它不使用 属性 setter,所以 OnPropertyChanged("ContributionCollection");
没有被调用
解决方案是使用 属性(顺便说一下,为什么方法不是 void?)
// 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);
}
您必须使用 Dispatcher 更新列表,这样您就不会像这样中断 GUI:
Dispatcher.BeginInvoke(new Action(() => _contributionCollection = new ObservableCollection<contribution>(queryContributions)));
我遇到了类似的问题:
查看
<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));
}
所以我的 UserControl
中有一个 DataGrid
。它数据绑定到 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 构造函数在初始化时触发查询。但是之后就不会再火了
知道我哪里出错了吗?
这一行
return _contributionCollection = new ObservableCollection<contribution>(queryContributions);
仅更新字段值。因为它不使用 属性 setter,所以 OnPropertyChanged("ContributionCollection");
没有被调用
解决方案是使用 属性(顺便说一下,为什么方法不是 void?)
// 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);
}
您必须使用 Dispatcher 更新列表,这样您就不会像这样中断 GUI:
Dispatcher.BeginInvoke(new Action(() => _contributionCollection = new ObservableCollection<contribution>(queryContributions)));
我遇到了类似的问题:
查看
<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));
}