如何在listview的datatemplate中订阅事件

时间:2012-07-05 12:09:23

标签: wpf events xaml mvvm command

在WPF中,我有一个绑定到ObservableCollection的列表视图。

XAML:

<ListView Name="listView" DockPanel.Dock="Top" ItemsSource="{Binding Path=ListOfOldData}" SelectedItem="{Binding Path=SelectedOldData, Mode=TwoWay}" SelectionMode="Single">
        <ListView.ContextMenu>
            <ContextMenu>
              <Button Content="Load" Command="{Binding Path=LoadCommand}"  Name="loadButton" Height="23" Width="75" DockPanel.Dock="Left"/>             
              <!-- Is working just fine -->         
            </ContextMenu>
        </ListView.ContextMenu>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"
                           Text="{Binding Path=Name}" FontWeight="Bold"><TextBlock Text=" - " FontWeight="Normal"/><TextBlock Text="{Binding Path=UpdateDatum}" FontWeight="Normal"/></TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

我真正希望收到的是双击所选项目。因为我无法将命令绑定到xaml中的文本块(可以吗?)我尝试通过MouseLeftButtonDown-Event执行此操作。但事件从未收到过!

C#(代码背后):

private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Console.WriteLine("MouseLeftButtonDown received!");
}

我做错了什么?我怎样才能收到这个活动?顺便说一句:上下文菜单的命令工作正常:)

更新我发现了我的错误 - &gt;我在错误的usercontrol中添加了该事件。该死的我不知所措。抱歉打扰你们。

2 个答案:

答案 0 :(得分:3)

你可以简单地使用混合sdk(System.Windows.Interactivity.dll)中的InvokeCommandAction

    <ListView x:Name="lvw" ItemsSource="{Binding ListOfOldData}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <i:InvokeCommandAction  Command="{Binding Path=OpenCommand}" 
                                            CommandParameter="{Binding ElementName=lvw, Path=SelectedItem}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </ListView>

编辑: viewmodel看起来像这样:

    public List<object> ListOfOldData{ get; set; }

    private DelegateCommand<object> _openCommand;//or RelayCommand

    public DelegateCommand<object> OpenCommand
    {
        get { return _openCommand?? (this._openCommand= new DelegateCommand<object>(this.Execute)); }
    }

    private void Execute(object obj)
    {
        //obj is your selectedItem
    }

ps:dunno你的类型就是为什么对象

答案 1 :(得分:1)

ListView有一个DoubleClick MouseEvent。 这应该这样做:

<ListView MouseDoubleClick="DoubleClickOnIt">
   <ListView.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding Path=Name}" FontWeight="Bold">
            <TextBlock Text=" - " FontWeight="Normal"/>
            <TextBlock Text="{Binding Path=UpdateDatum}" FontWeight="Normal"/>
         </TextBlock>
      </DataTemplate>
   </ListView.ItemTemplate>

   <ListViewItem>
      dddd
   </ListViewItem>
   <ListViewItem>
      eeeee
   </ListViewItem>
</ListView>

背后的代码:

private void DoubleClickOnIt(object sender, MouseButtonEventArgs e)
{
   var listView = sender as ListView;
   var selectedItem = listView.SelectedItem;
   Console.WriteLine("received!");
}