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

Comments

8 responses to “WPF ListView – Lấy đối tượng được click”

  1. huongpt

    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. namdh

    thanks, không rõ là bạn đang quan tâm cụ thể là vấn đề gì ?

  3. Y Học

    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

  4. Y Học

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

    …..

  5. Y Học

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

    …..

  6. Y Học

    [!CDATA

    ]

  7. Y Học

    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

  8. cuong

    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

Leave a Reply

Discover more from Đào Hải Nam blog

Subscribe now to keep reading and get access to the full archive.

Continue reading