1

这可能是一个非常容易解决的问题,但我在处理事件方面缺乏经验,所以我只是想问一下。

我有一个 ListBox,里面有 ListBoxItems。这些 ListBoxItem 将绑定到数据源,因此它们会发生变化。当对这些 ListBoxItem 中的任何一个执行 MouseDown 操作时,我需要引发一个 MouseDown 事件(因为我正在执行拖放操作)。由于值在变化,我不能期望在 XAML 中将事件连接在一起,如下所示

<ListBox Name="ListBox1">
    <ListBoxItem MouseDown="MouseDownEventName">Item A</ListBoxItem>
    <ListBoxItem MouseDown="MouseDownEventName">Item B</ListBoxItem>
    <ListBoxItem MouseDown="MouseDownEventName">Item C</ListBoxItem>
</ListBox>

如果我有静态值,这将很容易,但由于 ListBox 中的值会改变,我更愿意编写以下 XAML

 <ListBox Name="ListBox1" MouseDown="MouseDownEventName">
     //Binded Values
</ListBox>

然后,当 ListBoxItem 被选中时,它会将事件冒泡到这个 MouseDownEventName,那时我可以抓取 ListBox1.SelectedItem,问题是,我现在正在尝试这个,但它不起作用。我有以下代码来处理 MouseDown,它目前仅重写标签内容以表示该项目已被 MouseDown'ed。

    public partial class UserControl1 : UserControl
    {
    public UserControl1()
    {
        InitializeComponent();
    }

    private void ListBox_MouseDown(object sender, RoutedEventArgs e)
    {
        ListBox box = (ListBox)sender;
        if (box != null && box.SelectedItem != null)
        {

            DragDrop.DoDragDrop(box, ItemListBox.SelectedItem, DragDropEffects.Move);
            label1.Content = "MouseDown Event Fired";
        }
    } 
}
4

1 回答 1

3

使用 XAML,您可以为表单中包含的不同类型提供模板。例如,在这种情况下,您可以指定 ListBoxItem 触发某个事件处理程序。这是 XAML 标记代码的大部分(详情见此处:如何在项目模板化时捕获 Click on ListboxItem?

<ListBox>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBoxItem_PreviewMouseLeftButtonDown"/>
        </Style>
    </ListBox.ItemContainerStyle>
...
</ListBox>

之前要检查的另一件事是尝试将 DragDrop.DoDragDrop() 方法调用更改为其他方法,以查看问题是否与该方法有关。由于标签的内容正在发生变化,我想它与该方法有关。

于 2011-01-18T18:46:18.170 回答