2012-05-17 3 views
1

У меня есть класс Seive, объект ObservableCollection seiveData.C# WPF: сбой при заполнении DataGrid

 public Seive(String id) 
    { 
     SeiveIdSize = id; 
     Caret = 0.0; 
     Percent = 0.0; 
     Peices = 0; 
     Weight = 0.0; 
     Size = 0; 
    } 

    public String SeiveIdSize { get; set; } 
    public Double Weight { get; set; } 
    public Double Percent { get; set; } 
    public Double Caret { get; set; } 
    public uint Size { get; set; } 
    public uint Peices { get; set; } 

В моем XML есть:

<DataGrid Name="serverGrid" ItemsSource="{Binding}" .....> 
<DataGrid.Columns> 
<DataGridTextColumn Header="SEIVE" Width="Auto" Binding="{Binding Path=SeiveIdSize}" SortDirection="Ascending" /> 
<DataGridTextColumn Header="CTS" Width="Auto" Binding="{Binding Path=Caret}" /> 
<DataGridTextColumn Header=" % " Width="Auto" Binding="{Binding Path=Percent}" /> 
<DataGridTextColumn Header="PCS" Width="Auto" Binding="{Binding Path=Peices}" /> 
<DataGridTextColumn Header="WGT" Width="Auto" Binding="{Binding Path=Weight}" /> 
<DataGridTextColumn Header="SIZE" Width="Auto" Binding="{Binding Path=Size}" />          
</DataGrid.Columns> 

В окне Loaded случае, я заполняю 2 в seiveData сит, но я не вижу никаких результатов/строк.

seivesData.Add(new Seive("+10")); 
seivesData.Add(new Seive("+8")); 
seivesDataGrid.DataContext = seivesData; 

EDIT: Кнопка Код события:

 private void saveBtn_Click(object sender, RoutedEventArgs e) 
    { 
     Seive s1 = new Seive("+2"); 
     s1.Peices = 100; 
     s1.Caret = 0.41; 
     s1.Weight = 0.10; 
     seivesData.Add(s1); 
     Seive s = seivesData[0]; 
     s.Caret = 0.54; 
     s.Weight = 0.32; 
     seivesData[0] = s; 
     seiveDG.DataContext = seivesData; 
    } 

Где я буду неправильно? Я могу видеть недавно добавленную Seive все подробности, но Not the Caret & Вес добавлен в 0-й ряд.

+0

когда-нибудь слышал о 'INotifyPropertyChanged'? Очень важный интерфейс для таких требований. –

ответ

2

Основная проблема, которую я вижу в вашем xaml, заключается в том, что вы устанавливаете ItemSource = {binding SeiveData} , что неверно, если передать это свойство в контексте данных сетки.

Этот ниже код работает сейчас. Проверь это.

еще одна вещь, если вы хотите уведомить chagnes в классе Seive, тогда необходимо реализовать интерфейс INotifyPropertyChange.

XAML

<DataGrid Name="serverGrid" ItemsSource="{Binding}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Width="Auto" 
           Binding="{Binding Path=SeiveIdSize}" 
           Header="SEIVE" 
           SortDirection="Ascending" /> 
      <DataGridTextColumn Width="Auto" 
           Binding="{Binding Path=Caret}" 
           Header="CTS" /> 
      <DataGridTextColumn Width="Auto" 
           Binding="{Binding Path=Percent}" 
           Header=" % " /> 
      <DataGridTextColumn Width="Auto" 
           Binding="{Binding Path=Peices}" 
           Header="PCS" /> 
      <DataGridTextColumn Width="Auto" 
           Binding="{Binding Path=Weight}" 
           Header="WGT" /> 
      <DataGridTextColumn Width="Auto" 
           Binding="{Binding Path=Size}" 
           Header="SIZE" /> 
     </DataGrid.Columns> 
    </DataGrid> 

Cose за

ObservableCollection<Seive> _seiveData; 
     public ObservableCollection<Seive> SeiveData 
     { 
      get { return _seiveData; } 
      set { _seiveData = value; } 
     } 
     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 

      SeiveData = new ObservableCollection<Seive>(); 
      SeiveData.Add(new Seive("+10")); 
      SeiveData.Add(new Seive("+8")); 

      serverGrid.DataContext = SeiveData; 

     } 

класса

public class Seive 
    { 
     public Seive(String id) 
     { 
      SeiveIdSize = id; 
      Caret = 0.0; 
      Percent = 0.0; 
      Peices = 0; 
      Weight = 0.0; 
      Size = 0; 
     } 

     public String SeiveIdSize { get; set; } 
     public Double Weight { get; set; } 
     public Double Percent { get; set; } 
     public Double Caret { get; set; } 
     public uint Size { get; set; } 
     public uint Peices { get; set; } 
    } 
+0

Спасибо. Я реализовал INotifyPropertyChange в моем классе Seive, и он сработал. Еще раз спасибо. – Tvd

1

Вы упомянули, что используете список, но для привязки данных к работе вам нужно будет использовать ObservableCollection<T>, который будет уведомлять datagrid, если коллекция изменится.

EDIT:

Как было отмечено в комментариях, это не об изменениях. Вы уже устанавливаете свой datacontext в список, поэтому в вашем DataContext не будет seiveData. Вместо этого, попробуйте следующее:

ItemsSource="{Binding}"

Если вам все еще нужно, чтобы уведомить Ваше мнение об изменениях, считают ObservableCollection<T>, как уже было сказано.

+1

, но вопрос не о изменениях, вопрос о заполнении сетки данных. –

+0

Я изменил список на ObservableCollection, но никакой разницы. – Tvd

+0

В загруженном событии я заменил Datacontext на ItemSource, как вы mentioend, и да, я могу видеть данные. Но я не просто добавляю, но могу добавить и изменить динамически. В клике btn я добавил новую Seive и изменил некоторые значения 0-го числа и вызвал .DataContenxt = seivesData ;. Недавно добавленный файл был обновлен/замечен в datagrid, но обновленные значения 0-го объекта не были обновлены. Почему так ? – Tvd

0

Возможно, DataContext контейнера, в который входит DataGrid, не установлен на объект, который служит для свойства seiveData. Или, может быть, ваш seiveData -list даже не подкреплен свойством, а является только полем. Это запрещено. Даже если поле (переменная-член) объявлено общедоступным, механизм привязки не будет привязан к нему - он должен быть подкреплен свойством.

Pleasee уведомление также, если вы заполните список в Loaded-события, seiveList должен быть INotifyCollectionChanged -implementing коллекции, такие как ObservableCollection<T>, поскольку связывание осуществляется перед населением списка. В противном случае DataGrid не будет знать, что новые данные были вставлены в список.

0

Один из способов, как и каждый из указанных, - связать его с ObservableCollection.

Другим способом является привязка из DataTable.

Преобразование списка в DataTable с помощью

How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow

Creating a DataTable From a Query (LINQ to DataSet)

Я нашел это сегодня. Очень эффективный.

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