2013-06-25 74 views
5

我有一個ListBox,我通過動態填充的結合(這在一個DataTemplate限定,這就是爲什麼所述結合是有點不尋常):列表框「IsSelected」結合僅部分工作

<ListBox SelectionMode="Extended" ItemsSource="{Binding DataContext.ResultList, RelativeSource={RelativeSource AncestorType=Window}}"> 
    <ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
    </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Label Content="{Binding Object}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

每個ListBoxItem' s IsSelected屬性綁定到自定義對象上的IsSelected屬性。

當我選擇個人ListBoxItem s時,綁定工作正常 - 自定義對象的IsSelected屬性在我的ViewModel中更新。但是,如果我通過Ctrl + A命令選擇了所有ListBoxItem,則只有當前可見的ListBoxItem(當前在我的滾動視口中的那些)更新其ViewModel綁定。在前端,似乎選擇了所有ListBoxItem,並且容器ListBox上的ListBox.SelectedItems.Count屬性顯示所有項目均已選中。

此外,當我通過Ctrl + A選擇全部ListBoxItem後,滾動瀏覽ListBox時,當每個ListBoxItem滾動到視圖中時,綁定都成功更新。

爲什麼此綁定似乎只是部分工作?當可以同時選擇大量的ListBoxItems時,是否有更好的方法來處理IsSelected屬性的綁定?

編輯: 此行爲不會與Ctrl + A鍵命令完全發生 - 選擇使用Shift +點擊所有項目時,我得到了相同的結果。

+1

我不會依賴於UI來做到這一點,你寧願放一個'KeyBinding'並在ViewModel中執行該操作,或者將一些代碼放在後面並將選擇邏輯委託給VM。或者把行爲或對這個關鍵組合起反應的東西。 –

+0

@HighCore - 全部選擇命令不會發生問題;當我使用shift +單擊選擇每個項目時會發生同樣的問題。 –

+1

我遇到了同樣的問題。我放棄了,並使用[SelectedItems]的綁定(http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selecteditems.aspx)作爲Click處理器的參數按鈕,並將其稱爲一天(您也可以將它用作Command的CommandParameter)。當列表變長時,關閉虛擬化並不值得。 –

回答

5

我認爲你所看到的行爲是由於VirtualizingStackPanel.IsVirtualizing在默認情況下結合ItemsSourceListBox

如果您如設置您的ListBox比如是True

<ListBox VirtualizingStackPanel.IsVirtualizing="False" SelectionMode="Extended" ItemsSource="{Binding DataContext.ResultList, RelativeSource={RelativeSource AncestorType=Window}}"> 

<ListBox ...> 
    ... 
    <ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel /> 
    </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

,那麼你應該會看到你的所有綁定物品都有其IsSelected按Ctrl + A或Shift +相應更新...

即使虛擬化,集合的屬性(如Count)也會報告正確的值以適應諸如計算所需的ScrollBar.Height之類的內容。在View-port之外的項目不會被渲染,因此沒有綁定對它們有效,直到它們真正被使用。

+0

這樣做!謝謝,很棒! –

+0

它的工作。但是,這個虛擬化是什麼以及它爲什麼導致了這個問題呢? –

+0

「標準版面系統爲每個與列表控件關聯的項目創建項目容器並計算版面設計。」虛擬化「這個詞指的是一種技術,通過該技術可以根據哪些項目從大量數據項中生成UI元素子集在屏幕上只顯示少量元素時生成很多UI元素可能會影響性能VirtualizationStackPanel計算可見項的數量並使用ItemContainerGenerator從ItemsControl(例如ListBox或ListView)創建UI元素僅用於可見項目。「 –