2015-12-22 28 views
8

Tôi có một thiết lập mà trông như thế này:WPF DataGrid giá trị tế bào thay đổi sự kiện

// myDG is a DataGrid whose columns are DataGridTextColumn 
ObservableCollection<MyItem> myOC; 
// myOC is populated with some new MyItem 
myDG.ItemsSource = myOC; 

nơi MyItem thực hiện INotifyPropertyChanged. Cách để bắt đúng khi người dùng nhập nhập giá trị vào ô?

Tôi đã thử bắt PropertyChanged trên MyItem giây, nhưng tôi cũng cập nhật giá trị theo định kỳ trong nền (ý tưởng là khi người dùng chỉnh sửa thủ công giá trị, cờ được kích hoạt cho biết tính toán định kỳ để tránh ghi đè dữ liệu được nhập theo cách thủ công). Vì vậy, PropertyChanged bắt tất cả mọi thứ, bao gồm cả các bản cập nhật định kỳ, mà tôi không muốn. Tôi cho rằng có thể thực hiện công việc này (bằng cách đặt cờ khi tôi tính toán định kỳ, sau đó kiểm tra sự vắng mặt của cờ trên trình xử lý sự kiện PropertyChanged - nhưng tôi muốn biết nếu có giải pháp đơn giản hơn.)

I đã cố gắng bắt myDG.CurrentCellChanged nhưng điều đó được kích hoạt mỗi lần người dùng thay đổi lựa chọn ô, chứ không phải cụ thể khi họ chỉnh sửa nội dung ô.

Edit: Đây là XAML:

<DataGrid x:Name="myDG" ItemsSource="{Binding}" AutoGenerateColumns="False" Margin="10,10,182,0" VerticalAlignment="Top" Height="329" ClipboardCopyMode="IncludeHeader"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Col1" Binding="{Binding Prop1}" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Col2" Binding="{Binding Prop2}" IsReadOnly="False"/> 
    </DataGrid.Columns> 
</DataGrid> 

Đây là việc thực hiện MyItem (sử dụng Fody/PropertyChanged):

[ImplementPropertyChanged] 
class MyItem : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 

    public MyItem() 
    { 
     Prop1 = Prop2 = ""; 
    } 
} 
+0

bạn có thể hiển thị việc triển khai XAML của mình không. –

+0

Chỉ cần thay đổi phương thức setter? –

+0

Bạn đã xem danh sách các sự kiện được DataGrid tiếp xúc chưa? https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid_events(v=vs.100).aspx – AnjumSKhan

Trả lời

16

Giải pháp là để bắt sự kiện CellEditEnding.

// In initialization 
myDG.CellEditEnding += myDG_CellEditEnding; 

void myDG_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
{ 
    if (e.EditAction == DataGridEditAction.Commit) 
    { 
     var column = e.Column as DataGridBoundColumn; 
     if (column != null) 
     { 
      var bindingPath = (column.Binding as Binding).Path.Path; 
      if (bindingPath == "Col2") 
      { 
       int rowIndex = e.Row.GetIndex(); 
       var el = e.EditingElement as TextBox; 
       // rowIndex has the row index 
       // bindingPath has the column's binding 
       // el.Text has the new, user-entered value 
      } 
     } 
    } 
} 
+1

và để xóa? –

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