2012-07-05 31 views
1

在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!"); 
} 

我在做什么错?我怎样才能收到这个活动?顺便说一句:contextmenu的命令工作得很好:)

UPDATE我发现我的错误 - >我在错误的usercontrol中添加了事件。该死的我失踪的集中。对不起,烦扰你们。

回答

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!"); 
} 
+0

这不适合我。我不知道为什么,但它从来没有在事件处理程序中运行。 – basti 2012-07-05 12:40:28

+1

我不知道你有什么,我有它在这里编译和工作:) – MBen 2012-07-05 12:43:28

+0

是否有可能是一个问题,因为我的listview是在扩展器? – basti 2012-07-05 12:47:03

3

,你可以简单地使用InvokeCommandAction从混合SDK(System.Windows.Interactivity.dll)

<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:不知道你的类型多数民众赞成为什么对象

+0

来自MVVM Light的EventToCommand以同样的方式工作。 – blindmeis 2012-07-05 12:46:45

+0

但是不适用于我:( 命令没有被调用。什么是可能的问题?任何想法? – basti 2012-07-05 12:48:49

+1

在你的vs输出窗口中的任何绑定错误?如果不是你应该从你的视图模型和视图发布所有相关的代码。 – blindmeis 2012-07-05 13:11:35