WPF ListView – Lấy đối tượng được click


Trong WPF, để lấy được đối tượng mà người dùng vừa click chuột trong một ListView, các bạn có thể làm như sau:

Đầu tiên bạn cần đăng ký hàm xử lý cho sự kiện nhấn chuột:

MyListView.MouseDoubleClick += new MouseButtonEventHandler(MyListView_MouseDoubleClick);
chú ý là bạn có thể đăng ký cho các hàm nhấn chuột khác như MouseLeftButtonDown, MouseRightButtonDown… và sau đó viết hàm xử lý sự kiện giống như sau:
void MyListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
   DependencyObject dep = (DependencyObject)e.OriginalSource;

   while ((dep != null) && !(dep is ListViewItem))
   {
       dep = VisualTreeHelper.GetParent(dep);
   }

   if (dep == null)
        return;

   MyDataItemType item = (MyDataItemType)MyListView.ItemContainerGenerator.ItemFromContainer(dep);

   // Do something with the item...
}
Cách chúng ta làm là đầu tiên, ta phải xác định đối tượng trực quan mà người dùng vừa nhấn chuột lên, từ đó chúng ta lần theo các đối tượng chứa nó cho đến khi tìm được một ListViewItem, và nhờ đó ta có thể tìm được đối tượng dữ liệu tương ứng. Nếu muốn lấy chỉ số thay vì đối tượng, dùng hàm IndexFromContainer().
Đoạn mã trên được viết trong VB.NET như sau:
Dim dep As DependencyObject = CType(e.OriginalSource, DependencyObject)
While ((dep IsNot Nothing) AndAlso Not (TypeOf (dep) Is System.Windows.Controls.ListViewItem))
    dep = VisualTreeHelper.GetParent(dep)
End While
If (dep Is Nothing) Then
    Return
End If
Dim item As MyDataItemType = CType(MyListView.ItemContainerGenerator.ItemFromContainer(dep), MyDataItemType)
Theo http://mikescodeblog.blogspot.com

8 thoughts on “WPF ListView – Lấy đối tượng được click

  1. bạn có thể nói thêm nữa về WPF các samples chứ, mình cũng rất quan tâm đến vấn đề này, rất vui hợp tác

  2. Chào anh, Em đang nghiên cứu wpf..Mặc dù nó rất sâu và rộng…
    Tình Hình là em nghiên cứu caics control và đặc biệt là databinding của nó.
    Một số vấn đề em gặp là khi binding em đã ok.. có điều khi làm em tao 1 datagrid để hiển thị những thứ trong CSDl…
    Đoạn mã = XAML

    …….

    và Codebehind xử lí cho sự kiện để thực hiện binding :
    int Mansx = (int)this.cmbNSX.SelectedValue;

    this.lsSanPham.DataContext = from p in dsHoanLong.SanPham
    from b in dsHoanLong.NhaSX
    where p.MaNSX == b.MaNSX && p.MaNSX == Mansx
    select new { p.TenSP, p.ThoiGianBH, p.SoLuong, p.NgaySX };
    // this.lsSanPham là cái list view
    thế nhưng nó báo lỗi.Em biết là do em không chuyển đổi kiểu ngay nên thẻ textbox báo lỗi.Trong VB thì người ta dùng CType nhưng con C# thì sao anh.???
    Em có gõ thử CType thế nhưng nó lỗi
    A, Nếu được, Anh cho em hỏi về dependencyObject luôn? em có đọc nhưng chỉ hiểu sơ sơ..
    Em cám ơn anh rất nhiều

  3. Hic.. kì quá… Mất tiêu đoạn mã XAML.. em gởi lại cho anh nè !

    …..

  4. Hic.. kì quá… Mất tiêu đoạn mã XAML.. em gởi lại cho anh nè !

    …..

  5. Em xin lỗi vì gởi nhiều ậy… nhưng mà nó hok hiện lên đoạn mã XAML em gởi anh…Anh xóa mấy cái mà em gởi lỗi giúp em…Cám ơn Anh nhiều

  6. Anh nam!
    Em có ListView,em muốn hiện tất cả sản phẩm mà có ký tự bất đầu bằng A.Code em viết như sao:
    var timKiem = from a in snhoa.san_phams
    where a.ten_san_pham.StartsWith(“A”)
    select a;
    ListView1.DataSource = timKiem;
    ListView1.DataBind();
    Nhưng sao nó chỉ hiện ra sản phẩm đầu tiên ah.
    Anh giúp em với!!1

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s