2012-07-05 36 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