我有一个 DataGrid,它通过异步方法从 ViewModel 中填充数据。我的 DataGrid 是:
<DataGrid ItemsSource="{Binding MatchObsCollection}" x:Name="dataGridParent"
Style="{StaticResource EfesDataGridStyle}"
HorizontalGridLinesBrush="#DADADA" VerticalGridLinesBrush="#DADADA" Cursor="Hand" AutoGenerateColumns="False"
RowDetailsVisibilityMode="Visible" >
我使用 http://www.amazedsaint.com/2010/10/asynchronous-delegate-command-for-your.html在我的视图模型中实现异步方式。
下面是我的视图模型代码:
public class MainWindowViewModel:WorkspaceViewModel,INotifyCollectionChanged
{
MatchBLL matchBLL = new MatchBLL();
EfesBetServiceReference.EfesBetClient proxy = new EfesBetClient();
public ICommand DoSomethingCommand { get; set; }
public MainWindowViewModel()
{
DoSomethingCommand = new AsyncDelegateCommand(
() => Load(), null, null,
(ex) => Debug.WriteLine(ex.Message));
_matchObsCollection = new ObservableCollection<EfesBet.DataContract.GetMatchDetailsDC>();
}
List<EfesBet.DataContract.GetMatchDetailsDC> matchList;
ObservableCollection<EfesBet.DataContract.GetMatchDetailsDC> _matchObsCollection;
public ObservableCollection<EfesBet.DataContract.GetMatchDetailsDC> MatchObsCollection
{
get { return _matchObsCollection; }
set
{
_matchObsCollection = value;
OnPropertyChanged("MatchObsCollection");
}
}
//
public void Load()
{
matchList = new List<GetMatchDetailsDC>();
matchList = proxy.GetMatch().ToList();
foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
{
_matchObsCollection.Add(match);
}
}
正如您可以在 ViewModel 中的 Load ()方法中看到的那样,我首先从我的 Service 获得 match List (一个 DataContractClass 的列表)。然后通过 foreach 循环,我将 match List 项插入到 my _ match ObsCollection (它是 DataContractClass 的 Observer ableCollection)中。现在我得到了上面的错误(正如我在标题中所显示的)“这种 CollectionView 不支持从与 Dispatcher 线程不同的线程更改它的 SourceCollection”
有人能给我提点建议吗。此外,如果可能的话,我想知道如何在视图中绑定我的 DataGrid,如果有更好的方法,还可以异步刷新它。