PDA

View Full Version : Lấy giá trị của Selected Cell in WPF



kennywoo
17-11-2010, 11:23
Việc làm tưởng chừng như đơn giản trong WinForm hay ASP nay đã trở nên cực kì phức tạp trong WPF .Tớ đã tham khảo rất nhiều link từ msdn hay stackoverflow mà quả thật không cách nào khả thi.Gia đình mình ai biết thì giúp mình với mình quả thật đang đau đầu vì rắc rối này quá

littleNeo
17-11-2010, 18:06
Từ SelectedCells ban lấy ra DataGridCellInfo bạn cần tìm, trong cái info đó nó có Item là object tại row tương ứng và Column của Cell được select. Tùy vào loại Column bạn tìm ra được Binding trên Column đó. Cái Path của Binding chính là Tên Property mà Column đó bind vào. có Item và có PropertyName rồi thì bạn biết phải làm gì rối đó.

kennywoo
17-11-2010, 20:42
Code của mình như sau :
private void dataGrid1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
dataGrid1.SelectionUnit =DataGridSelectionUnit.Cell;
DataGridCellInfo cell =dataGrid1.SelectedCells[0];
string value =((TextBlock)cell.Column.GetCellContent(cell.Item) ).Text;
label1.Content = value;

}
Tuy nhiên khi Debug thì báo lỗi
"Specified argument was out of the range of valid values.
Parameter name: index" ở chỗ DataGridCellInfo cell =dataGrid1.SelectedCells[0];
Mình hiểu ý bạn nói nhưng khi thực thi thì ko khả thi mấy .Bạn có code về vấn đề này thì giúp mình nhé.Thanks bạn rất nhiều mình đang nghiên cứu WPF còn rất nhìu cái mơ hồ mong bạn giúp đỡ nhé (có thể thì bạn cho mình mail hay nick Y!M - Skype để tiện liên lạc bạn nhé)
Regard :)

littleNeo
18-11-2010, 22:14
Cách của bạn cũng được đấy. Nhưng cụ thể là bạn muốn làm gì ?
Lấy value trực tiếp từ GUI ko phải là điểm mạnh của WPF.
Đa phần các bạn làm Winform nhiều qua sẽ thấy WPF rất khác. Pattern của Winform có tên là Anti-Pattern hay còn gọi là Smart-UI.
Còn pattern dùng cho WPF là MVVM, View Model ViewModel được tách ra rất rõ ràng.

Nếu bạn muốn Validation, Update DB thì những cái đó nên nằm ở ViewModel. Phía View 90% khi làm WPF là viết XAML. Thường trong WPF có rất nhiều cách để giải quyết 1 vấn đề bằng cách phối hợp các loại control với nhau.

Thường tớ rất ít lấy value trực tiếp từ GUI trong WPF mà đa số là tìm thông qua Binding, vì như vậy sẽ ko phải quan tâm đến converter của Binding. Bạn để ý thì sẽ thấy các loại DataGridXXColumn đều dùng binding để đưa data vào. Đó là lý do tớ thích dùng Binding hơn.

kennywoo
19-11-2010, 08:38
Tớ hiểu nhưng ro ràng khi mình show db ra DataGrid và Client click và một Cell nào đó tớ muốn bắt lấy value của Cell mà Client click vào để xứ lý.
Rõ ràng vấn đề này từ winform thực hiện rất dễ dàng nhưng wa đây sao mà phức tạp quá, tớ cũng dạo quanh rất nhiều 4rum từ msdn stackoverflow hay codeproject nhưng dường như ko tìm thấy giải pháp.
Bạn có thể post source code của bạn giải quyết vấn đề trên không?

littleNeo
19-11-2010, 10:10
Demo: http://subversion.assembla.com/svn/shared_kane/WpfDataGrid.zip

Mình dùng AttachedProperty DataField để giữ tên của Property mà Column Bind vào, như vậy sẽ đỡ mất công đi tìm Binding Path hơn.

Demo mình viết theo MVVM, code-behind của MainWindow chỉ có mỗi nhiệm vụ gọi xuống ViewModel thôi, nó ko làm gì cả.

Do làm biếng nên mình dùng DepedencyObject cho ViewModel và Model luôn. Bạn nên cẩn thận khi dùng DependencyObject vì sau này sẽ gặp vấn đề Cross-Thread Access khi làm multi-threading trên application. Cách tốt nhất là dùng INotifyPropertyChanged cho ViewModel và Model (nhưng phải chịu khó implement :D)

kennywoo
19-11-2010, 13:45
So many thanks bạn hiền :)
Tớ hiểu rồi .Bạn thật tốt bụng khi nhiệt tình giúp đỡ mình như vậy.
P.S :Cho mình xin Y!M hay Skype nhé
(của mình là nguoitinhmongmo9999 - Skype là minhquoc_amyco)