2013-07-29 37 views
7

Tôi không giỏi tiếng Anh vì tôi không phải là người bản xứ. Tôi xin lỗi nếu tôi đã phạm sai lầm trong ngôn ngữ :)Ràng buộc một DataFrid WPF vào một DataTable

Tôi mới trong C# và WPF và tôi đang cố gắng liên kết một DataFrid WPF với một DataTable trong TwoWay. Bây giờ khi tôi chỉnh sửa các giá trị trong DataGrid, dữ liệu trong DataTable thay đổi chính xác. Khi tôi cố gắng điền vào DataTable bằng mã sau:

mã hoạt động và DataGrid có vẻ ổn. Nhưng khi tôi thử điều này:

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

giá trị hiển thị không thay đổi. Tôi cố gắng kiểm tra các giá trị trong DataGrid theo cách sau:

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

và không có vấn đề gì. Tôi tự hỏi tại sao giá trị hiển thị như thế này.

Dưới đây là DataGrid.CellStyle tôi trong 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> 

Tôi đã bị mắc kẹt trên vấn đề này trong vài ngày. Cảm ơn vì bất kì sự giúp đỡ!

+0

Khi bạn xác định cột cho DataGrid, hãy đảm bảo bạn đang đặt thuộc tính UpdateMode thành PropertyChanged – Sivakumar

Trả lời

0

Thật không may, tôi không tin rằng DataRow triển khai INotifyPropertyChanged hoặc DataTable thực hiện INotifyCollectionChanged. Đây là giao diện cho biết WPF DataBinding cập nhật khi giá trị nguồn cơ bản thay đổi. Vì vậy, khi bạn cập nhật các giá trị DataTable cơ bản, Binding không được tự động làm mới và thay đổi sẽ không được phản ánh trong số DataGrid của bạn.

This link trỏ đến một câu hỏi tương tự và cung cấp câu trả lời. Về cơ bản, nếu bạn muốn DataGrid của mình nhận ra và cập nhật khi bạn thay đổi giá trị trong nguồn dữ liệu cơ bản, bạn cần phải tạo đối tượng/đối tượng tùy chỉnh triển khai INotifyPropertyChanged.

+1

afaik wpf là ràng buộc với mô hình dữ liệu gạch dưới và như vậy với IBindingListView và vì vậy nó có tất cả các công cụ Thông báo – blindmeis

+0

Đây có vẻ là một chủ đề nhiều tranh luận, nhưng nếu bạn nhìn vào câu trả lời thứ hai cho [câu hỏi này] (http: // stackoverflow.com/questions/11154381/datagrid-bound-to-datatable-not-refresh-values), và cụ thể là các chú thích được giải thích. Giao diện IBindingListView không thay thế cho nhu cầu INotifyPropertyChanged. –

+0

Bạn cũng có thể xem [thuyết trình này] (http://es.slideshare.net/EyalV/data-binding-in-depth-presentation) bởi một MVP, trượt 24, nó nói rằng các mục trong bộ sưu tập IBindingListView phải triển khai INotifyPropertyChanged. –

4

này hoạt động, có lẽ bạn có thể đưa ra một số biết thêm

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

Tôi không phải là rất chắc chắn nếu giải pháp này sẽ làm việc nhưng nó là giá trị một thử.

Thay vì ràng buộc DataGrid của bạn thành DataTable, hãy thử liên kết nó với DataView. Bạn có thể chuyển đổi của bạn DataTable đến một DataView sử dụng DefaultView tài sản như

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

Mở liên kết với DataView thông báo của bạn với những thay đổi trong dữ liệu nên làm việc cả hai cách.

+0

bạn đúng như dataGrid1.ItemSource = dt.DefaultView; –

Các vấn đề liên quan