2016-12-14 36 views
1

时,我有一个简单的数据网格WPF Datagrid的选择问题,得到的数据异步

 <DataGrid x:Name="dgSample" ItemsSource="{Binding Items, IsAsync=True}" AutoGenerateColumns="False" SelectionMode="Single" CanUserAddRows="False" CanUserDeleteRows="False" SelectionUnit="FullRow"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Date" Binding="{Binding Date}" IsReadOnly="True"/> 
       <DataGridTemplateColumn Header="Sent" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox IsChecked="{Binding Sent}" IsEnabled="False" HorizontalAlignment="Center"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

我填充这个数据网格从项目对象后面

代码:

public List<Item> Items { get; set;} 

    private async void GetData() 
    { 
     await Task.Run(() => 
     { 
      GetItems(); 
     }); 
    } 

    private void GetItems() 
    { 
     Items = facade.GetItems(); 
    } 

一切正常,我获取数据并填充datagrid异步。当我想选择一行时,问题就出现了,我不能。我点击一个单元格,选择自动消失。

当我填充数据网格的同步问题消失

+0

我不会用'List',通常你想要一个'ObservableCollection'绑定到' ItemsSource'。你多久填充'Items'?你是按需还是定期做? – mechanic

+0

我按需填充项目。即使我使用ObservableCollection,问题仍然存在。此外,我实现INotifyPropertyChanged,所以应该不会有任何问题列表 user1416072

+0

我的猜测是,你可能有其他代码清除选择,因为你显示的代码看起来不错。你使用任何MVVM框架?当你说“当我填充数据网格同步”时,你的意思是加载项目异步,或者你从xaml中的绑定中移除IsAsync? –

回答

0

您需要使用async/await all the way down,否则你可能会死锁UI线程。

这个工作对我来说(我用棱镜):

using Prism.Commands; 
using System; 
using System.Collections.Generic; 
using Prism.Mvvm; 
using System.Collections.ObjectModel; 
using Models; 
using System.Threading.Tasks; 

public class ItemsViewModel : BindableBase 
{ 
    private MyFacade facade; 
    public ItemsViewModel() 
    { 
     facade = new MyFacade(); 
     Items = new ObservableCollection<Item>(); 
    } 
    public ObservableCollection<Item> Items { get; private set; } 

    public DelegateCommand GetDataCommand => new DelegateCommand(GetData); 

    private async void GetData() 
    { 
     // it's the best practice to wrap an async void and use an async Task 
     await GetItems(); 
    } 

    private async Task GetItems() 
    { 
     // not really async 
     var result = await facade.GetItems(); 
     Items.Clear(); 
     Items.AddRange(result); 
    } 

    class MyFacade 
    { 
     public async Task<List<Item>> GetItems() 
     { 
      // not really async 
      var items = new List<Item>(); 
      items.Add(new Item { Name = "Joe", Date = DateTime.Now }); 
      items.Add(new Item { Name = "Bob", Date = DateTime.Now }); 
      items.Add(new Item { Name = "Sam", Date = DateTime.Now }); 
      return items; 
     } 
    } 
} 

查看:

<UserControl x:Class="DataGridPopulatedAsync.Views.ItemsView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:prism="http://prismlibrary.com/" 
     prism:ViewModelLocator.AutoWireViewModel="True"> 
<StackPanel> 
    <Button Command="{Binding GetDataCommand}" Content="Get Data" /> 
    <DataGrid ItemsSource="{Binding Items}" /> 
</StackPanel> 
</UserControl>