現在基本上有兩個問題在這裏,讓我輕輕地向你介紹我現在遇到的問題。假設我們有一個常規的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;
}
問題時間:
- 爲什麼在
RoutedEventArgs
的RoutingStrategy
列爲Direct
而不是Tunneling
?我認爲所有Preview
事件是Tunneling
。
- 而更重要的一個:將上述溶液作品,如果我把一個斷點內
CheckItem
,選擇不發生和細節崩潰了,一切正常 如預期。如果我刪除斷點,則會選擇項目,並且 細節部分打開,就好像事件未從 傳播一樣。爲什麼會發生?我認爲設置Handled
到true
在RoutedEventArgs
應該只是表明 事件是真的處理。
[編輯]
現在我已經找到了一種 '骯髒' 的解決辦法,我只能附加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
不夠後來以抑制:)
@Blam事件觸發,它基本上與使用' '相同,但這樣你就必須在視圖後面的代碼中處理事件將事件附加到Caliburn的Micro附加屬性使您能夠在視圖模型中處理此事件。儘管如此,即使您使用'EventSetter'並在代碼隱藏中執行所有操作,它仍然是相同的 - 事件經過,Details行打開。 –
2012-08-05 00:58:46