2011-11-11 10 views
0

次のxamlコードは、3つの列を持つリストビューを生成します。 ListView ItemsSourceは、observablecollectionです。最初の列には、特定の行のオブジェクトの名前が表示されます。第2列および第3列には、特定の行のオブジェクトに関連付けられたボタンが表示されます。ユーザーは「転送オブジェクト」または「プロパティ情報を取得」ボタンをクリックしたときに 新しい行を選択すると、リストビューの行が選択されたままになる

<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イベントハンドラ

は、私の見解モデルでSelectedObjectFromListプロパティにListView.SelectedItemをバインドします。このプロパティを使用して、選択したオブジェクトをビューモデルに公開します。

は、ここでの背後にあるコードで私のSelectCurrentItemハンドラのC#のコードです:

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

これは素晴らしい作品!ユーザーがボタンをクリックすると、その行のListView observablecollectionオブジェクトからSelectedObjectFromListプロパティが更新されます。

1つの問題:リスト内のボタンをクリックすると、最近選択された行が選択されているように見えます(GUIでハイライト表示されています) )。

私はListViewコントロールのisFocusedプロパティを設定することで問題を解決しようとした:私はStackOverflowののexeptionを与えるもちろん

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

:)。誰もが、この場合のGUIでListView.Selectionを更新するサンプルコードを持っていますか?前もって感謝します。

+0

タグはタイトルには含まれません。 –

答えて

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をsingleに設定しました。完璧。 (明らかに私はwpf noobieです) – EnLaCucha