2013-07-29 6 views
7

Я не очень хорошо владею английским языком, потому что я не носитель языка. Прошу прощения, если я допустил ошибки на языке :)Связывание WPF DataGrid с DataTable

Я новичок в C# и WPF, и я пытаюсь связать DataGrid WPF с DataTable в TwoWay. Теперь, когда я редактирую значения в DataGrid, данные в DataTable изменяются правильно. Когда я пытаюсь заполнить DataTable с помощью следующего кода:

OleDbDataAdapter adapter = new OleDbDataAdapter("a query", (a connection)); 
adapter.Fill(dataTable); 

код работает, и DataGrid кажется все в порядке. Но когда я попробую:

dataTable.Rows[0][1] = (some object); 

Значение дисплея не изменяется. Я пытаюсь проверить значения в DataGrid следующим образом:

MessageBox.Show((SomeDataGrid.Items[0] as DataRowView).Row[1].ToString()); 

, и это не проблема. Мне интересно, почему значения отображения выглядят так.

Вот мой DataGrid.CellStyle в XAML:

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="DataGridCell"> 
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{TemplateBinding Background}"> 
         <DataGridDetailsPresenter HorizontalAlignment="Stretch" VerticalAlignment="Center" Content="{TemplateBinding Content}"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <!-- triggers --> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 

Я застрял на эту проблему в течение нескольких дней. Спасибо за любую помощь!

+0

При определении столбца для DataGrid, Убедитесь, что вы устанавливаете свойство UpdateMode в PropertyChanged – Sivakumar

ответ

0

К сожалению, я не считаю, что DataRow оснащает INotifyPropertyChanged или DataTable орудиями INotifyCollectionChanged. Это интерфейс, который сообщает WPF DataBinding для обновления при изменении исходного значения источника. Поэтому, когда вы обновляете базовые значения DataTable, Binding не будет автоматически обновляться, и изменение не будет отражено в вашем DataGrid.

This link указывает на аналогичный вопрос и дает ответ. В принципе, если вы хотите, чтобы ваш DataGrid распознавал и обновлял при изменении значений в базовом источнике данных, вам необходимо создать пользовательский объект/объекты, которые реализуют INotifyPropertyChanged.

+1

AFAIK МОФ является обязательным к подчеркивающий DataView и так к IBindingListView и поэтому он имеет все Notification вещи – blindmeis

+0

Это, кажется, тема много, но если вы посмотрите на второй ответ на [этот вопрос] (http: // stackoverflow.com/questions/11154381/datagrid-bound-to-datatable-not-refreshing-values), и, в частности, комментарии объясняются. Интерфейс IBindingListView не заменяет необходимость в INotifyPropertyChanged. –

+0

Вы также можете посмотреть [эту презентацию] (http://es.slideshare.net/EyalV/data-binding-in-depth-presentation) MVP, сжатый 24, в нем указано, что элементы в коллекции IBindingListView должны реализовать INotifyPropertyChanged. –

4

Это работает, может быть, вы можете дать некоторую информацию

ViewModel:

public DataTable MyDataTable { get; private set; } 

//ctor 
_ds = new DataSet("Test"); 
this.MyDataTable = _ds.Tables.Add("DT"); 
this.MyDataTable.Columns.Add("First"); 
this.MyDataTable.Columns.Add("Second"); 

this.MyDataTable.Rows.Add("11", "12"); 
this.MyDataTable.Rows.Add("21", "22"); 

//view is updated with this 
public void UpdateTable() 
{ 
    this.MyDataTable.Rows[0][1] = "haha"; 
} 

XAML

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyDataTable}"/> 
4

Я не очень уверен, что если это решение будет работать, но это стоит пытаться.

Вместо привязки DataGrid к DataTable, попробуйте привязать его к DataView. Вы можете конвертировать ваши DataTable в DataView используя DefaultView свойство как

DataTable dt = new DataTable(); 
DataView dv = dt.DefaultView; 

При связывании с DataView вашего уведомления изменения в данных должны работать в обоих направлениях.

+0

, вы правы как dataGrid1.ItemSource = dt.DefaultView; –

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