使用XAML数据绑定获取单击的Item对象

时间:2017-03-08 23:31:40

标签: c# wpf xaml listbox click

我将ListBox绑定到一个items集合,该集合包含我的Item类的实例。

此部分按预期工作。我遇到的问题是访问单击的ListBox项//Loop for 1D int i,j,k, n=2, result[50]; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { for (k = 0; k < n; k++) { result[k] = c[i][j]; result[k] += a[i][k] * b[k][j]; printf("%i ", result[k]); } } } 实例。我已经包含了完整的示例和相关的XAML。

我还提供了一个示例,说明我希望如何访问item事件处理程序中的Item实例。

我认为我遗漏了一些明显的东西,但是当我点击一个项目时代码崩溃了。我错过了另一种粘合剂来粘合所有这些吗?

谢谢

代码

listBoxItems_PreviewMouseDown

XAML

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Threading;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // Item class
        internal class Item : INotifyPropertyChanged
        {
            public Item(string name = null)
            {
                this.Name = name;
            }

            public string Name { get; set; }
            public string ImagePath { get; set; }
            public string SomeString { get; set; }
            public int SomeInt { get; set; }

            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

        // Item collection
        ObservableCollection<Item> ItemsCollection;

        public MainWindow()
        {
            InitializeComponent();

            // Initialize the items collection
            this.ItemsCollection = new ObservableCollection<Item>();

            for (int i = 0; i < 5; i ++)
            {
                Dispatcher.Invoke(new Action(() =>
                {
                    Item newItem = new Item
                    {
                        Name = "test " + i,
                        ImagePath = @"Images\" + i + ".jpg",
                        SomeString = "example" + i,
                        SomeInt = i,
                    };

                    // Add the new item to the collection
                    this.ItemsCollection.Add(newItem);
                }), DispatcherPriority.Background);
            }

            // Set the items source
            this.listBoxItems.ItemsSource = this.ItemsCollection;
        }

        // Handle mouse down events on listbox items
        private void listBoxItems_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            // Ideally, i'd like to do something like this
            Item item = sender as Item;

            // So then I could do for example
            Console.WriteLine(@"Clicked item SomeString: {0}, SomeInt {1}", item.SomeString, item.SomeInt);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以获取该事件的OriginalSource并检查其DataContext

var item = (e.OriginalSource as FrameworkElement)?.DataContext as Item;
if (item != null) { /* Do something with item... */ }

答案 1 :(得分:1)

除了接受的答案,您也可以将Docklands...事件直接绑定到PreviewMouseDown

在这种情况下, XAML 可以(强调添加的ListBoxItem节点):

<ListBox.ItemContainerStyle>

处理程序

<userControls:MyListBox x:Name="ItemsListBox" ItemsSource="{Binding ItemsCollection}" PreviewMouseDown="listBoxItems_PreviewMouseDown">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <VirtualizingStackPanel>
                <Image Source="{Binding ImagePath}" Width="200" Height="100"/>
                <TextBlock Text="{Binding Name}" />
            </VirtualizingStackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <EventSetter Event="PreviewMouseDown" Handler="listBoxItems_PreviewMouseDown" />
        </Style>
    </ListBox.ItemContainerStyle>
</userControls:MyListBox>