2015-08-02 4 views
2

Я использую ObservableCollection, определенный в классах MainWindow простого приложения WPF. По какой-то причине обновление списка (я вижу это при отладке), однако пользовательский интерфейс не обновляется.DataBinding для DataGrid не работает?

Теперь, если я создаю Timer и закольчу его, я могу обновить DataGrid, установив ItemSource. Это работает, но вызывает ужасное мерцание в моем DataGrid.

public ObservableCollection<CalculatedData> calculatedData { get; set; } 

Далее в мой код я использую эту строку для фактического обновления или добавления данных в список.

calculatedData = await CalculateData(); 

CalculateData функция определяется следующим образом:

private Task<ObservableCollection<CalculatedData>> CalculateData() 
{ 
    return Task.Run(() => 
    { 
     ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>(); 
     // Do a lot of stuff 
     return cdList; 
    }); 
} 

Для моего xaml У меня есть простой DataGrid, как показано ниже:

<DataGrid Name="dataGrid" ItemsSource="{Binding calculatedData}" IsReadOnly="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" /> 

Вопрос: Почему не DataGrid быть взломанным? Будет ли это исправлять мою мерцающую проблему, поскольку я не перевязываю?

-

UPDATE

Я даже изменил свое основное заявление на следующее (с Iv'e видел, как это делается таким образом), но я до сих пор не получил его на работу.

private ObservableCollection<CalculatedData> calculatedData = new ObservableCollection<CalculatedData>(); 
public ObservableCollection<CalculatedData> CalculatedData 
{ 
    get { return calculatedData; } 
    set 
    { 
     calculatedData = value; 
    } 
} 

XAML:

<DataGrid Name="dataGrid" ItemsSource="{Binding CalculatedData}" IsReadOnly="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" /> 
+0

Что происходит в "dataGrid_AutoGeneratingColumn"? – Sajeetharan

+0

@Sajeetharan хороший вопрос! Я удаляю определенный столбец и просто переименовываю другие заголовки столбцов. Итак, ничего необычного. –

ответ

2

Если вы просто сделать:

private async void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     calculatedData = await CalculateData(); 
     dataGrid1.ItemsSource = calculatedData; 
    } 

он будет работать. Я предполагаю, что ваша привязка XAML, вероятно, не работает, потому что DataContext не определен.

EDIT: Вот полный код,

MainWindow:

public partial class MainWindow : Window 
{ 
    public ObservableCollection<CalculatedData> calculatedData { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private async void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     calculatedData = await CalculateData(); 
     dataGrid1.ItemsSource = calculatedData; 
    } 

    private Task<ObservableCollection<CalculatedData>> CalculateData() 
    { 
     return Task.Run(() => 
     { 
      ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>(); 

      // Do a lot of stuff 
      cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 }); 
      cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 }); 
      cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 }); 
      cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 }); 
      cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 }); 

      return cdList; 
     }); 
    } 
} 

XAML:

<Grid> 
    <DataGrid x:Name="dataGrid1" Margin="0" /> 
</Grid> 

Результат:

enter image description here

EDIT 2: добавлена ​​кнопка и немного перемещен код, чтобы вы могли протестировать.

public partial class MainWindow : Window 
{ 
    public ObservableCollection<CalculatedData> calculatedData { get; set; } 
    int i; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     //initialize your binding collection 
     calculatedData = new ObservableCollection<CalculatedData>(); 
    } 

    private async void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     i = 1; 
     //create initial data and bind to data grid 
     calculatedData = await CalculateData(); 
     dataGrid1.ItemsSource = calculatedData; 
    } 

    private Task<ObservableCollection<CalculatedData>> CalculateData() 
    { 
     return Task.Run(() => 
     { 
      ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>(); 

      // Do a lot of stuff 
      for (int j = 0; j < 5; j++) 
      { 
       cdList.Add(new CalculatedData { Data1 = i, Data2 = i + 1, Data3 = i + 2 }); 
       i++; 
      } 

      return cdList; 
     }); 
    } 
    private async void button1_Click(object sender, RoutedEventArgs e) 
    { 
     //place new data in a temporary collection 
     ObservableCollection<CalculatedData> newData = await CalculateData(); 

     //add new data to the collection bound to the data grid 
     //preferably, don't just replace it 
     //any business logic you may need for adding, 
     //deleting, filtering data, etc goes here 
     foreach (CalculatedData cd in newData) 
      calculatedData.Add(cd); 
    } 
} 
+0

В моем конструкторе 'MainWindow' я добавил' DataContext = this; 'и получаю заголовки столбцов, но все же нет данных? –

+0

Вам даже не нужен DataContext. Я отредактирую свой ответ с полным кодом. – jsanalytics

+0

Я делаю то же самое, что вы делаете, но в функции таймера. Однако это вызывает ужасное мерцание моего DataGrid. Это то, чего я пытаюсь избежать. (а также настройку источников каждого галочки). –

0

Вы заменяете источник предметов каждый раз, когда пытаетесь добавить элементы из результата CalculateData();

var data = await CalculateData(); 
foreach(var d in data) 
    calculatedData.Add(d); 

также не уверен, что вы инициализировали свойство CalculatedData init в конструкторе.

CalculatedData = new ObservableCollection<yourType>(); 

дайте мне знать, если это сработает.

+0

Это все еще не работает для меня. Элементы находятся в моем списке, но пользовательский интерфейс никогда не обновляется, а мой datagrid просто пуст (даже не отображаются столбцы заголовков). –

Смежные вопросы