2010-05-28 23 views
3

我有一個非常平坦的行爲。我在View中有一個ListBox,其中的項目包括ViewModels,並有一個DataTemplate。我將IsSelected綁定到我的ViewModel並使用SelectionMode =「Extended」。一切正常。 但如果我添加VirtualiuationMode =「回收」我得到錯誤的項目。 重現:使用Ctrl選擇項目,然後向下滾動並選擇一個項目。正常的行爲取消選擇所有項目,只需選擇最後一個沒有Holled Ctrl。 但是,如果我檢查我的ViewModel所有的舊項目被選中!?!ListBox中的選擇錯誤,VirtualizationMode =「Recycling」和SeclectionMode =「Extended」?

<Grid> 
    <StackPanel> 
     <ListBox ItemsSource="{Binding People}" MaxHeight="100" 
       SelectionMode="Extended" 
       VirtualizationMode="Recycling"> 
      <!--VirtualizingStackPanel.IsVirtualizing="True">--> 

      <ListBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ListBoxItem}"> 
        <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" /> 

       </Style> 

      </ListBox.ItemContainerStyle> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 

        <views:PeopleView /> 

       </DataTemplate> 

      </ListBox.ItemTemplate> 
     </ListBox> 
     <Button Click="Button_Click"> 
      OK 
     </Button> 
    </StackPanel> 
</Grid> 

的項目模板

<UserControl x:Class="WpfApplication1.View.PeopleView" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="Auto" Width="Auto"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" SharedSizeGroup="A"/> 
     <ColumnDefinition Width="Auto" SharedSizeGroup="B"/> 
    </Grid.ColumnDefinitions> 
    <TextBox Text="{Binding Path=Name}" 
      Name="tbx_Name" 
      Grid.Column="0"/> 

    <CheckBox IsChecked="{Binding Path=IstAktiv}" 
     Name="cbx_IstAktiv" 
       Grid.Column="1"/> 

</Grid> 

任何想法?

+0

小錯誤代碼: VirtualizingStackPanel.VirtualizationMode =「回收」 但我仍然有問題... – KCT 2010-05-31 06:41:51

回答

1

我有一個解決方法,但爲什麼我必須在更改事件中「手動」更改而不是通過數據綁定?

private void Lbx_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     ListBox lbx = (ListBox)sender; 
     foreach (PersonViewModel item in lbx.Items) 
     { 
      item.IsSelected = lbx.SelectedItems.Contains(item); 
     } 
    } 
1

相關KCT早期的答案另一種方法是使用來自SelectionChangedEventArgsAddedItemsRemovedItems和目標的變化,如:

private void Lbx_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    foreach (var item in e.AddedItems) 
    { 
     ((PersonViewModel)item).IsSelected = true; 
    } 
    foreach (var item in e.RemovedItems) 
    { 
     ((PersonViewModel)item).IsSelected = false; 
    } 
} 

這可能會具有較大的收藏更好的性能(I」已經在ListBox中的Virtualizing Tile Panel中獲得了大約15,000個條目)。