2016-12-14 8 views
1

У меня есть простой DataGridWPF 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> 

Я заселить этот DataGrid от элементов объекта

код позади:

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

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

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

Все работает отлично, я получить данные и заполнить datagrid async. Проблема возникает, когда я хочу выбрать строку, я не могу. Я нажимаю на ячейку, и выбор автоматически исчезает.

Когда я заполнить DataGrid синхронизации проблема уходит

+0

Я бы не использовать 'list', как правило, вы хотите,' ObservableCollection', привязанные к ' ItemsSource'. Как часто вы заполняете «Элементы»? Вы делаете это по требованию или периодически? – mechanic

+0

Я заполняю пункты по требованию. Даже если я использую ObservableCollection, проблема сохраняется. Кроме того, я реализую INotifyPropertyChanged, поэтому не должно быть никаких проблем со списком user1416072

+0

Я предполагаю, что у вас может быть другой код, очищающий выделение, потому что этот код, который вы показываете, выглядит хорошо. Используете ли вы какую-либо структуру MVVM? Когда вы говорите «Когда я заполняю синхронизацию datagrid», вы имеете в виду, что вы загружаете элементы async или вы удаляете IsAsync из привязки в xaml? –

ответ

0

Вы должны использовать async/await all the way down, в противном случае вы можете тупиковой нить UI.

Это работает для меня (я использовал Prism):

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>