2011-11-11 72 views
0

以下xaml代碼會生成一個包含三列的ListView。 ListView ItemsSource是一個可觀察的集合。第一列顯示特定行中對象的名稱。第二列和第三列顯示與特定行中的對象關聯的按鈕。選擇新行後ListView行保持選中狀態

<Grid Width="497" Height="260"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="309*" /> 
     <ColumnDefinition Width="188*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="478*" /> 
     <RowDefinition Height="4*" /> 
    </Grid.RowDefinitions> 
    <GroupBox Header="ObservableCollection Object List" HorizontalAlignment="Left" Width="497" BorderBrush="Black" BorderThickness="2" Grid.ColumnSpan="2"> 
     <ListView ItemsSource="{Binding Path=CollectionList}" Name="QueueListView"> 
      <ListView.Resources> 
       <Style TargetType="{x:Type ListViewItem}"> 
        <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/> 
       </Style> 
      </ListView.Resources> 
      <ListView.SelectedItem> 
       <Binding Path="SelectedObjectFromList" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" > 
       </Binding>    
      </ListView.SelectedItem> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Width="140" Header="Object Name" DisplayMemberBinding="{Binding Name}" /> 
        <GridViewColumn Width="160" Header="Property Information"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <Button Content="Get Property Info" Command="{Binding Path=GetObjProperties}" 
             DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" />      
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn Width="180" Header="Transfer"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <Button Content="Transfer Object" Command="{Binding Path=TransferObjHere}" 
             DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </GroupBox> 
</Grid> 

的SelectCurrentItem事件處理程序綁定ListView.SelectedItem到SelectedObjectFromList財產在我的視圖模型,當用戶點擊「傳輸對象」或「獲取屬性信息」按鈕。我用這個屬性來將選定的對象暴露給我的視圖模型。

這裏是我的SelectCurrentItem處理程序的C#代碼在後面的代碼:

protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e) 
    { 
     ListViewItem viewItem = (ListViewItem)sender; 
     viewItem.IsSelected = true; 
    } 

這個偉大的工程!當用戶點擊一個按鈕時,SelectedObjectFromList屬性將從該行的ListView observablecollection對象中更新。 (在點擊按鈕之前,不需要手動單擊ListView行來設置屬性。)

一個問題:當我單擊列表中的按鈕時,最近選擇的行仍然顯示爲被選中(它們在GUI中突出顯示)。

我試圖通過設置ListView控件的屬性isFocused解決問題:

protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e) 
    { 
     ListViewItem Item = (ListViewItem)sender; 
     Item.IsSelected = true; 
     Item.IsFocused = true; 
    } 

當然,這給了我一個StackOverflow的exeption :)。有沒有人有在這種情況下更新GUI中的ListView.Selection的示例代碼?提前致謝。

+0

標籤不屬於標題。 –

回答

2

ListViews允許您一次選擇多個項目。當你點擊第2個項目,你不進行重置老所選項目爲False的IsSelected屬性,因此它是保持選擇

您可以嘗試兩種設置ListView的SelectionMode到單

<ListView SelectionMode="Single" ... /> 

或嘗試獲取舊的SelectedItem並在選擇新選項時取消選擇它

protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e) 
{ 
    var temp = myListBox.SelectedItem as ListViewItem; 
    if (temp != null) 
     temp.IsSelected = false; 

    ListViewItem viewItem = (ListViewItem)sender; 
    viewItem.IsSelected = true; 
} 
+0

非常感謝!我只是將SelectionMode設置爲單個。完善。 (顯然我是一個wpf noobie) – EnLaCucha