2012-08-04 102 views
0

現在基本上有兩個問題在這裏,讓我輕輕地向你介紹我現在遇到的問題。假設我們有一個常規的DataGrid,並且我嘗試在行上應用PreviewMouseRightButtonDown以實現自定義功能,同時避免選擇,因爲這會擴展Details視圖。我認爲this post would help; it was directed at ListView, but with few adjustment it should work the same, right?PreviewMouseRightButtonDown路由事件和WPF DataGrid


你爲什麼要這麼做?你可能會問,。 我想避免打開右鍵單擊的詳細信息,因爲在主項目中,Details部分會使數據庫(有時)漫長的行程,而右鍵單擊只會在集合中的視圖模型中設置相應的bool標誌屬性。


MainWindowView.xaml:

<DataGrid AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected"> 
    <!-- Columns ommitted for brevity --> 
<DataGrid.ItemContainerStyle> 
      <Style TargetType="{x:Type DataGridRow}"> 
      <!-- Since I'm using Caliburn Micro anyway, I'm going to redirect the event to view model. It doesn't really matter, issue exists with EventSetter too. --> 
       <Setter Property="cal:Message.Attach" Value="[Event PreviewMouseRightButtonDown] = [Action CheckItem($eventArgs, $source]"/> 
      </Style> 
     </DataGrid.ItemContainerStyle> 
</DataGrid> 

MainWindowViewModel.cs:

public void CheckItem(RoutedEventArgs args, object source) 
{ 
    var row = source as DataGridRow; 

    if (row != null) 
    { 
     var item = (ItemViewModel)row.Item; 
     item.IsChecked = true; 
    } 

    args.Handled = true; 
} 

問題時間:

  • 爲什麼在RoutedEventArgsRoutingStrategy列爲 Direct而不是Tunneling?我認爲所有Preview事件是 Tunneling

enter image description here

  • 而更重要的一個:將上述溶液作品,如果我把一個斷點內CheckItem,選擇不發生和細節崩潰了,一切正常 如預期。如果我刪除斷點,則會選擇項目,並且 細節部分打開,就好像事件未從 傳播一樣。爲什麼會發生?我認爲設置 HandledtrueRoutedEventArgs應該只是表明 事件是真的處理

[編輯]

現在我已經找到了一種 '骯髒' 的解決辦法,我只能附加PreviewMouseDown事件:

bool rightClick; 

public void MouseDown(object source, MouseEventArgs args) 
{ 
    rightClick = false; 

    if (args.RightButton == MouseButtonState.Pressed) 
    { 
     rightClick = true; 
     //do the checking stuff here 
    } 
} 

,然後掛接到SelectionChanged事件:

public void SelectionChanged(DataGrid source, SelectionChangedEventArgs args) 
{ 
    if (rightClick) 
     source.SelectedIndex = -1;   
} 

它適用於我的特殊情況,但主觀上看起來很臭,所以我接受任何其他建議。特別是爲什麼鼠標事件的簡單eventArgs.Handled = true不夠後來以抑制:)

+0

@Blam事件觸發,它基本上與使用''相同,但這樣你就必須在視圖後面的代碼中處理事件將事件附加到Caliburn的Micro附加屬性使您能夠在視圖模型中處理此事件。儘管如此,即使您使用'EventSetter'並在代碼隱藏中執行所有操作,它仍然是相同的 - 事件經過,Details行打開。 – 2012-08-05 00:58:46

回答

0

處理不降反升的PreviewMouseRightButtonUp的SelectionChanged燒製得到預期的效果,我(選擇必須向上而不是向下做什麼?)。

PreviewMouseRightButtonDown在MSDN頁說,它的路由策略應該是「直接」和Routed Events Overview頁說:

隧道事件有時也被稱爲是用來預覽事件,因爲命名約定的 ,爲對。

所以也許隧道事件通常預覽事件,但它並沒有真正說預覽事件有可能是隧道;)

編輯:

綜觀其他事件,如PreviewMouseDown VS的MouseDown它們雖然是Tunneling和Bubble,但也許只是Right/Left按鈕事件是直接完成的。

+0

你說得對,'PreviewMouseRightButtonUp'按我希望的那樣工作。奇怪的事情,雖然'PreviewMouseDown'不...無論如何,感謝您指出了這一點,我在這些事件中混合了太多,所以我甚至沒有嘗試'Up'版本。 :)既然它解決了我的主要問題,我會將其標記爲答案。 – 2012-08-06 01:08:12