2011-06-21 52 views
12

我使用MVVM,我綁定數據網格,以收集了一些代碼:Datagrid.IsSelected綁定和滾動

<DataGrid ItemsSource="{Binding Entites}" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" 
        SelectedItem="{Binding SelectedEntity}"> 

我ASLO使用使用樣式(RowStyle或ItemContainerStyle)

<DataGrid.RowStyle> 
     <Style> 
       <Setter Property="DataGridRow.IsSelected" Value="{Binding IsSelectedProperty, Mode=TwoWay}" />       
     </Style> 
</DataGrid.RowStyle> 

結合IsSelectedProperty它運作良好。但是,如果我滾動DataGrid,它停止工作。

回答

1

是否有一個特定的原因,你在RowStyle綁定?我一直將我的SelectedItem直接綁定到我的ViewModel中的SelectedEntity屬性。

+0

是的。原因是多選。 – vitidev

+0

啊。爲此,我剛剛創建了一個名爲MultiSelect或SelectedItems的依賴項屬性。 [鏈接這裏](http://forums.silverlight.net/forums/p/199937/467373.aspx) –

+0

我跟隨你的鏈接,並嘗試在datagrid上實現該示例。但我無法得到它來更新我的viewmodel中的「SelectedItems」屬性 – vitidev

16

我遇到了這個問題,其原因是在我的DataGrid中使用虛擬化 - 當你滾動選擇DataGridRow關閉屏幕時,DataGridRow視覺元素是破壞,一個新的創造,或者 - 如果DataGrid的VirtualizingStackPanel.VirtualizationMode財產設置爲Recycling - 它被重用於進入視口的任何行。

當發生任一事件時,ViewModel(及其IsSelectedProperty屬性集)與DataGridRow(及其IsSelected屬性集)之間的綁定被破壞。

要確認是這種情況,請嘗試將DataGrid的EnableRowVirtualization屬性設置爲false。

就我而言,我需要通過使用虛擬化所需的性能,並最終使用Attached Behaviors實施可選擇:具體而言,在連續點擊將使用LeftClickCommand附加的行爲對那臺IsSelectedProperty視圖模型調用的委託指令。然後,我使用DataGridRow樣式中綁定到IsSelectedPropertyDataTrigger來突出顯示該行。

該解決方案本質上涉及滾動您自己的選擇機制,但這是我發現同時獲得行虛擬化和MVVM友好行選擇的唯一方法。

+0

很奇怪。我寫的關於這個問題的虛擬化,但文本消失了。是的,這是原因。現在我通過在代碼隱藏中編寫代碼來解決問題。 我需要一個多選。使用按下按鈕「Shift」進行選擇時是否觸發事件? – vitidev

+0

我添加了一個'Control-Click'行爲,因此可以一次選擇多個行。使用'Shift'來選擇一個範圍是可能的,但是在我的特殊實例中沒有足夠的用處來證明處理所有與它有關的角落行爲。 –

+0

你可以添加一個DataTrigger的例子嗎? – KrisTrip

6

嘗試在DataGrid上設置虛擬化模式爲標準:VirtualizingStackPanel.VirtualizationMode="Standard"

我相信虛擬化默認打開,但模式是回收。因此,當滾動創建新行時,出於某種原因IsSelected屬性不會被重新評估。

+0

非常感謝你!它幫助了我!經過很多搜索我來到這裏,我真的很感謝你。 –